[解析]多线程加锁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')
相关文章推荐
- Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例
- 转:c++多线程调用python
- [VS2013]C++中调用Python脚本提示 error LNK2001: 无法解析的外部符号__imp_PyString_FromString等错误的解决方案
- python中GIL问题(多线程问题,调用的函数用C语言写)
- python利用or在列表解析中调用多个函数.py
- C++多线程调用Python多进程
- Python多线程调用Hive接口的MapReduce示例
- python调用mrjob实现hadoop的mapreduce日志解析
- C++多线程中调用python api函数
- Python自定义函数定义,参数,调用代码解析
- 多线程C调用python api的陷阱
- Python调用SQLPlus来操作和解析Oracle数据库的方法
- Python简单学习(lecture8)多线程、XML解析、JSON
- Qt中的信号和槽之connect----多线程调用全解析(同步/异步)
- python模块包调用解析
- 多线程C调用python api的陷阱
- python调用mrjob实现hadoop的mapreduce日志解析
- C++调用python时 debug链接错误python_d.lib无法解析的问题
- python jpype 调用Hanlp,使用列表解析.toString.encode("utf-8") 会出现乱码,需用使用for 循环