python线程互斥锁_Python多线程与互斥锁

多线程-threading

python的thread模块是⽐较底层的模块,python的threading 模块是对thread做了⼀些包装的,可以更加⽅便的被使⽤。

1.使⽤threading模块

from threading import Thread      #导入模块

t = Thread(target = xxx)          #创建线程实例  target = 函数名

t.start()                         #开始线程

说明

使⽤多线程并发的操作,花费时间要短很多

创建好的线程,需要调⽤start()⽅法来启动

主线程会等待所有的⼦线程结束后才结

python的threading.Thread类有⼀个run⽅法,⽤于定义线程的功能函 数,

可以在⾃⼰的线程类中覆盖该⽅法。⽽创建⾃⼰的线程实例后,通 过Thread类的start⽅法,

可以启动该线程,交给python虚拟机进⾏调 度,当该线程获得执⾏的机会时,就会调⽤run⽅法执⾏线程。

import threading

importtime

class MyThread(threading.Thread):

def run(self):

fori in range(3):

time.sleep(1)

msg="I'm"+self.name+'@'+str(i)#name属性中保存的是当前线程的

print(msg)

if __name__ =='__main__':

t = MyThread()

t.start()

多线程程序的执⾏顺序是不确定的。当执 ⾏到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进⼊就 绪(Runnable)状态,等待调度。⽽线程调度将⾃⾏选择⼀个线程执⾏。上 ⾯的代码中只能保证每个线程都运⾏完整个run函数,但是线程的启动顺序、 run函数中每次循环的执⾏顺序都不能确定。

总结

每个线程⼀定会有⼀个名字,尽管上⾯的例⼦中没有指定线程对象的 name,但是python会⾃动为线程指定⼀个名字。

当线程的run()⽅法结束时该线程完成。

⽆法控制线程调度程序,但可以通过别的⽅式来影响线程调度的⽅式。

线程的⼏种状态:

5、多线程共享全局变量,进程无法共享

在⼀个进程内的所有线程共享全局变量,能够在不适⽤其他⽅式的前提下完成多线程之间的数据共享(这点要⽐多进程要好)

缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量 的混乱(即线程⾮安全)

为了解决共享变量混乱问题,因此引入互斥锁:

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

线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引⼊互 斥锁。

互斥锁为资源引⼊⼀个状态:锁定/⾮锁定。

某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他 线程不能更改;直到该线程释放资源,将资源的状态变成“⾮锁定”,其他的 线程才能再次锁定该资源。互斥锁保证了每次只有⼀个线程进⾏写⼊操作, 从⽽保证了多线程情况下数据的正确性。

代码实现:

from threadind import Lock      #导入模块

mutex = Lock()                  #创建锁实例

mutex.acquire()                 #上锁

mutex.release()                 #解锁

其中,锁定⽅法acquire可以有⼀个blocking参数。

如果设定blocking为True,则当前线程会堵塞,直到获取到这个锁为⽌ (如果没有指定,那么默认为True)

如果设定blocking为False,则当前线程不会堵塞

当⼀个线程调⽤锁的acquire()⽅法获得锁时,锁就进⼊“locked”状态。

每次只有⼀个线程可以获得锁。如果此时另⼀个线程试图获得这个锁,该线 程就会变为“blocked”状态,称为“阻塞”,直到拥有锁的线程调⽤锁的 release()⽅法释放锁之后,锁进⼊“unlocked”状态。

线程调度程序从处于同步阻塞状态的线程中选择⼀个来获得锁,并使得该线 程进⼊运⾏(running)状态。

总结

锁的好处:

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

锁的坏处:

阻⽌了多线程并发执⾏,包含锁的某段代码实际上只能以单线程模式执 ⾏,效率就⼤⼤地下降了 由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对⽅持有 的锁时,可能会造成死锁

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值