码迷,mamicode.com
首页 > 编程语言 > 详细

Python学习

时间:2020-03-11 15:32:55      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:不能   参数   必须   假设   run   roc   out   个人   RoCE   

Python——互斥锁

1.进程之间的数据不能共享,但是共享同一套文件系统,所以访问同一个文件,或者同一个打印终端,是没有问题的,而共享带来的是竞争竞争带来是错乱

2.如何控制,就是加锁处理,而互斥锁就是互相排斥,假设把多个进程比喻成多个人,互斥锁的工作原理是多个人都要去争抢同一个资源:比如抢一个房间,谁先抢到这个资源就暂时先占为己有然后上个锁,然后在他占用的时间段内别人是要等他用完

hreading模块中定义了Lock类,可以方便的处理锁定:

1.创建锁
mutex = threading.Lock()

2.锁定
mutex.acquire([timeout])

3.释放
mutex.release()

其中,锁定方法acquire可以有一个超时时间的可选参数timeout。如果设定了timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理。
使用互斥锁实现上面的例子的代码如下:

from multiprocessing import Process,Lock
import time,random
#互斥锁:必须是lock.acquire()一次,然后lock.release()释放一次,才能继续lock.acquire()
#互斥锁和join区别
#大前提:二者的原理都是一样的,都是将并发变成串行,从而保证有序
#区别:join是按照认为指定的顺序执行,而互斥锁是所有的进程平等的竞争,谁先抢到谁执行
mutex=Lock()

#两个线程都在抢着对这个锁进行上锁,如果有一方成功上锁,那么导致另外一方会堵塞(一直等待),到这个锁被解开为之
thnum=0
class MyThread(threading.Thread):
    def run(self):
        mutex.acquire()
        for i in range(10000):
            global thnum
            thnum+=1    
        print(thnum)
        mutex.release()
 
def test():
    global thnum
    mutex.acquire()  #等待可以上锁,通知而不是轮训,没有占用CPU
    for i in range(10000):
        thnum+=1
    print(thnum)
    mutex.release()#解锁

Python学习

标签:不能   参数   必须   假设   run   roc   out   个人   RoCE   

原文地址:https://www.cnblogs.com/Alicebat/p/12462406.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!