线程(threading)

  • A+
所属分类:python基础入门

线程(threading

进程是系统进⾏资源分配和调度的⼀个独⽴单位.

线程是进程的⼀个实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的 能独⽴运⾏的基本单位.线程⾃⼰基本上不拥有系统资源,只拥有⼀点在运 ⾏中必不可少的资源(如程序计数器,⼀组寄存器和栈),但是它可与同属⼀ 个进程的其他的线程共享进程所拥有的全部资源.

与进程区别

⼀个程序⾄少有⼀个进程,⼀个进程⾄少有⼀个线程.

线程的划分尺度⼩于进程(资源⽐进程少),使得多线程程序的并发性⾼。

进程在执⾏过程中拥有独⽴的内存单元,⽽多个线程共享内存,从⽽极 ⼤地提⾼了程序的运⾏效率

线线程不能够独⽴执⾏,必须依存在进程中

优缺点

线程和进程在使⽤上各有优缺点:线程执⾏开销⼩,但不利于资源的管理和 保护;⽽进程正相反。

Thread模块实现方式:

导入模块(import threading )

t=Thread(target= XXX) XXX需要执行的代码块

t.start()

线程(threading)

例子中有睡眠1秒,但是加入线程后,执行时间缩短

定义一个类继承Thread

class MyThread(threading.Thread): 继承Thread类

def run(self ): 重写run方法

#代码

使用Start()执行

线程(threading)

线程的执行顺序

多线程的执行顺序是不确定的

主线程会等子线程结束后才结束

查看线程的数量:

length=len(threading.enumerate()) #查看线程数量

线程(threading)

为了让每个线程的封装性更完美,所以使⽤threading模块时,往往会定 义⼀个新的⼦类class,只要继承 threading.Thread 就可以了,然后重 写 run ⽅法

同步

在如图的代码中的执行结果如图:

线程(threading)

线程(threading)

在取消注释time.sleep()的运行结果不同,在没有注释时,w1还没执行结束,w2就开始执行,导致运行结果不一致,出现了线程共同调用一个数据会出现安全问题,这事就需要线程的同步,

互斥锁

当多个线程⼏乎同时修改某⼀个共享数据的时候,需要进⾏同步控制

保证多个线程安全访问竞争资源,最简单的同步机制是引⼊互 斥锁。 互斥锁为资源引⼊⼀个状态:锁定/⾮锁定

创建锁

lo=threading.Lock([blocking])

#锁定

lo.acquire()

其中,锁定⽅法acquire可以有⼀个blocking参数。 如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为⽌ (如果没有指定,那么默认为True) 如果设定blocking为False,则当前线程不会堵塞

#True表示堵塞 即如果这个锁在上锁之前已经被上锁了,那么这个线程会在这⾥⼀直等

#False表示⾮堵塞,即不管本次调⽤能够成功上锁,都不会卡在这,⽽是继续执⾏下

#释放

lo.release()

上锁解锁过程 当⼀个线程调⽤锁的acquire()⽅法获得锁时,锁就进⼊“locked”状态。 每次只有⼀个线程可以获得锁。如果此时另⼀个线程试图获得这个锁,该线 程就会变为“blocked”状态,称为“阻塞”,直到拥有锁的线程调⽤锁的 release()⽅法释放锁之后,锁进⼊“unlocked”状态。 线程调度程序从处于同步阻塞状态的线程中选择⼀个来获得锁,并使得该线 程进⼊运⾏(running)状态。

锁的好处: 确保了某段关键代码只能由⼀个线程从头到尾完整地执⾏

锁的坏处:

阻⽌了多线程并发执⾏,包含锁的某段代码实际上只能以单线程模式执 ⾏,效率就⼤⼤地下降了

由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对⽅持有 的锁时,可能会造成死锁

在多线程开发中,全局变量是多个线程都共享的数据,⽽局部变量等是 各⾃线程的,是⾮共享的

死锁

在线程间共享多个资源的时候,如果两个线程分别占有⼀部分资源并且同时 等待对⽅的资源,就会造成死锁。 尽管死锁很少发⽣,但⼀旦发⽣就会造成应⽤的停⽌响应。

避免死锁

程序设计时要尽量避免(银⾏家算法) 添加超时时间等

线程(threading)

上锁后的代码实例

weinxin
我的微信公众号
爱真理,得永生!          爱在灵灵久博客,网罗天下,福利大家!

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: