您的位置:首页 > 编程语言 > Python开发

[解析]多线程加锁Lock调用python2

2018-03-09 21:31 405 查看

没有加锁的代码如下

from atexit import register
from random import randrange
from threading import Threa
4000
d, currentThread
from time import sleep, ctime

class CleanOutputSet(set):
def __str__(self):
return ', '.join(x for x in self)

loops = (randrange(2, 5) for x in xrange(randrange(3, 7)))
remaining = CleanOutputSet()

def loop(nsec):
myname = currentThread().name
remaining.add(myname)
print '[%s] Start %s' % (ctime(), myname)
sleep(nsec)
remaining.remove(myname)
print '[%s] Completed %s (%d sec)' % (ctime(), myname, nsec)
print '     remaining: %s' % (remaining or 'NONE')

def main():
for pause in loops:
Thread(target=loop, args=(pause,)).start()

@register
def _atexit():
print 'End'

if __name__ == '__main__':
main()


没有加锁的情况下输出(中间或者后面的那些空行也是输出的部分)

[Fri Mar 09 21:17:53 2018] Start Thread-1
[Fri Mar 09 21:17:53 2018] Start Thread-2
[Fri Mar 09 21:17:53 2018] Start Thread-3
[Fri Mar 09 21:17:53 2018] Start Thread-4
[Fri Mar 09 21:17:53 2018] Start Thread-5
[Fri Mar 09 21:17:55 2018] Completed Thread-4 (2 sec)
remaining: Thread-5, Thread-3, Thread-2, Thread-1
[Fri Mar 09 21:17:55 2018] Completed Thread-5 (2 sec)
remaining: Thread-3, Thread-2, Thread-1
[Fri Mar 09 21:17:57 2018] Completed Thread-3 (4 sec)[Fri Mar 09 21:17:57 2018] Completed Thread-1 (4 sec)[Fri Mar 09 21:17:57 2018] Completed Thread-2 (4 sec)

remaining: NONE     remaining: NONE     remaining: NONE


由于没有加锁导致在输出的过程中,会使得整个IO变的很乱,还有,处理在全局变量中的remaining 那个set继承下来的东西时,会变的很麻烦。

总之,我们需要学习加锁的机制,只有这样才能更好地使用并发的机制。

加锁的代码

关键代码:

from threading import Thread, currentThread, Lock
lock = Lock()  # 放到全局变量当中


修改一下对应的loop部分,其他地方不变

def loop(nsec):
myname = currentThread().name
lock.acquire()
remaining.add(myname)
print '[%s] Start %s' % (ctime(), myname)
lock.release()
sleep(nsec)
lock.acquire()
remaining.remove(myname)
print '[%s] Completed %s (%d sec)' % (ctime(), myname, nsec)
print '     remaining: %s' % (remaining or 'NONE')
lock.release()


或者是改成这样也是可以的

def loop(nsec):
myname = currentThread().name
with lock:
remaining.add(myname)
print '[%s] Start %s' % (ctime(), myname)
sleep(nsec)
with lock:
remaining.remove(myname)
print '[%s] Completed %s (%d sec)' % (ctime(), myname, nsec)
print '     remaining: %s' % (remaining or 'NONE')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: