没有加锁的代码如下

from atexit import register
from random import randrange
from threading import Thread, currentThread
from time import sleep, ctimeclass 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().nameremaining.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().namelock.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().namewith 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')

[解析]多线程加锁Lock调用python2相关推荐

  1. c# 多线程中lock用法的经典实例

    一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行, ...

  2. C#多线程中lock的用法

    最近在看些c#的代码,发现很多是以前没有接触到了,只能上网查,把比较好的整理下来. 经常碰到同时需要对某个数据进行操作,或者对某个文件进行读写操作,对于这些操作我们以前往往不能很好的进行处理,自从C# ...

  3. Java 多线程加锁的方式总结及对比

    前言 Java多线程可以通过: synchronized关键字 Java.util.concurrent包中的lock接口和ReentrantLock实现类 这两种方式实现加锁. Lock 和 syn ...

  4. Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock

    在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(Reentrant ...

  5. python多线程加锁异步处理装饰器

    2019独角兽企业重金招聘Python工程师标准>>> 前言: 虽谈python多线程带有全局锁PIL,似乎对性能提升没什么意义,一般考虑多进程或者协程,但PIL没有被去掉还是应该有 ...

  6. Java 多线程启动为什么调用 start() 方法而不是 run() 方法?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:终于放弃了单调的swagger-ui了,选择了这款神器-knife4j个人原创100W+访问量博客:点击前往,查 ...

  7. python类库32[多线程同步Lock+RLock+Semaphore+Event]

    2019独角兽企业重金招聘Python工程师标准>>> 一 多线程同步 由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地 ...

  8. ThreadLocal原理解析以及是否需要调用remove方法

    平常的开发过程中,如果有个类不是线程安全的,比如SimpleDateFormat,要使这个类在并发的过程中是线程安全的,那么可以将变量设置位局部变量,不过存在的问题就是频繁的创建对象,对性能和资源会有 ...

  9. python线程安全的计数器_Python多线程同步Lock、RLock、Semaphore、Event实例

    一.多线程同步 由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源.大部分情况都推荐使用多进程. python的多线程的 ...

最新文章

  1. python判断是否有属性
  2. es6新语法Object.assign()
  3. java redis 数据自过期_Java架构-Redis的内存回收策略和Key过期策略,看这篇就够了...
  4. Hotspot hotswap, who and who are best freinds
  5. (3.4)HarmonyOS鸿蒙滑动事件三个动作
  6. const参数,const返回值与const函数
  7. Python | 多种编码文件(中文)乱码问题解决
  8. Dataframe 新增一列, apply 通用方法
  9. 线段树,最大值查询位子(个人模版)
  10. 淘宝TFS文件系统配置
  11. Android自带类实现语音合成
  12. 抗锯齿_像素画技巧AA手工抗锯齿教程
  13. Google Chrome旧版本下载
  14. 最新最全物联网行业报告: IOT时代已经到来
  15. 汇编语言编译器CmasmW的调试方法
  16. 机器学习面试知识点总结
  17. 微软消息队列-MSMQ
  18. 事件日志中出现TKK: 更新 TKK 失败,请检查网络连接,翻译插件用不了
  19. 被蠢人、穷人与聪明人放弃的“概率权”
  20. 安卓查壳与反编译相关知识集锦

热门文章

  1. vue-cli + lib-flexible + px2rem实现px自动转化为rem
  2. 转载OleDb操作Access数据库:新增记录时获取自动编号的主键值
  3. 一个身份证号码验证接口[2]
  4. Selenium WebDriver问题--Internet Explorer保护模式设置问题
  5. STP、RSTP、MSTP
  6. mysql忘记密码如何修改
  7. 你的网站添加X-UA-Compatible meta标签了吗?
  8. Ubuntu安装程序出现“Sub-process usrbindpkg returned an error code (1)”的问题
  9. 【数据挖掘笔记九】分类:高级方法
  10. (转载)IT未来发展五大趋势