2019独角兽企业重金招聘Python工程师标准>>>

一 多线程同步

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

python的多线程的同步与其他语言基本相同,主要包含:

Lock & RLock :用来确保多线程多共享资源的访问。

Semaphore : 用来确保一定资源多线程访问时的上限,例如资源池。

Event : 是最简单的线程间通信的方式,一个线程可以发送信号,其他的线程接收到信号后执行操作。

二 实例

1)Lock & RLock

Lock对象的状态可以为locked和unlocked,
使用acquire()设置为locked状态;
使用release()设置为unlocked状态。

如果当前的状态为unlocked,则acquire()会将状态改为locked然后立即返回。当状态为locked的时候,acquire()将被阻塞直到另一个线程中调用release()来将状态改为unlocked,然后acquire()才可以再次将状态置为locked。

Lock.acquire(blocking=True, timeout=-1),blocking参数表示是否阻塞当前线程等待,timeout表示阻塞时的等待时间 。如果成功地获得lock,则acquire()函数返回True,否则返回False,timeout超时时如果还没有获得lock仍然返回False。

实例:(确保只有一个线程可以访问共享资源)

import threading
import timenum = 0
lock = threading.Lock()def func(st):global numprint (threading.currentThread().getName() + ' try to acquire the lock')if lock.acquire():print (threading.currentThread().getName() + ' acquire the lock.' )print (threading.currentThread().getName() +" :%s" % str(num) )num += 1time.sleep(st)print (threading.currentThread().getName() + ' release the lock.'  )        lock.release()t1 = threading.Thread(target=func, args=(8,))
t2 = threading.Thread(target=func, args=(4,))
t3 = threading.Thread(target=func, args=(2,))
t1.start()
t2.start()
t3.start()

结果:

RLock与Lock的区别是:RLock中除了状态locked和unlocked外还记录了当前lock的owner和递归层数,使得RLock可以被同一个线程多次acquire()。

2)Semaphore

Semaphore管理一个内置的计数器,

每当调用acquire()时内置计数器-1;

调用release() 时内置计数器+1;

计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。

实例:(同时只有2个线程可以获得semaphore,即可以限制最大连接数为2):

import threading
import time semaphore = threading.Semaphore(2)def func():if semaphore.acquire():for i in range(5):print (threading.currentThread().getName() + ' get semaphore')semaphore.release()print (threading.currentThread().getName() + ' release semaphore')for i in range(4):t1 = threading.Thread(target=func)t1.start()

结果:

3) Event

Event内部包含了一个标志位,初始的时候为false。
可以使用使用set()来将其设置为true;
或者使用clear()将其从新设置为false;
可以使用is_set()来检查标志位的状态;
另一个最重要的函数就是wait(timeout=None),用来阻塞当前线程,直到event的内部标志位被设置为true或者timeout超时。如果内部标志位为true则wait()函数理解返回。

实例: (线程间相互通信)

import logging
import threading
import timelogging.basicConfig(level=logging.DEBUG,
format="(%(threadName)-10s : %(message)s",
)def wait_for_event_timeout(e, t):"""Wait t seconds and then timeout"""while not e.isSet():logging.debug("wait_for_event_timeout starting")event_is_set = e.wait(t)logging.debug("event set: %s" % event_is_set)if event_is_set:logging.debug("processing event")else:logging.debug("doing other work")e = threading.Event()
t2 = threading.Thread(name="nonblock",
target=wait_for_event_timeout,args=(e, 2))
t2.start()
logging.debug("Waiting before calling Event.set()")
time.sleep(7)
e.set()
logging.debug("Event is set")

运行结果:

三 其他

1) 线程局部变量

线程局部变量的值是跟线程相关的,区别与全局的变量。使用非常简单如下:

mydata = threading.local()

mydata.x = 1

2)对Lock,semaphore,condition等使用with关键字代替手动调用acquire()和release()。

完!

转载于:https://my.oschina.net/apoptosis/blog/125202

python类库32[多线程同步Lock+RLock+Semaphore+Event]相关推荐

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

    多线程基础:python类库32[多线程同步] 一 多线程同步 由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源.大部 ...

  2. python类库32[多进程同步Lock+Semaphore+Event]

    同步的方法基本与多线程相同. 1) Lock 当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突. import multiprocessing import sys def worke ...

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

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

  4. python 线程 的类库_python类库32[多线程]

    一 python 多线程 因为CPython的实现使用了Global Interpereter Lock(GIL),使得python中同一时刻只有一个线程在执行,从而简化了python解释器的实现,且 ...

  5. 32 多线程同步值Semaphore(信号量)

    互斥锁是只允许一个线程访问共享数据,而信号量是同时允许一定数量的线程访问共享数据,比如银行柜台有5个窗口,允许同时有5个人办理业务,后面的人只能等待,待柜台有人办理完业务后才可以进行相应的柜台办理. ...

  6. python停车场_python 多线程同步锁之实现停车场业务 (1)

    好久没用Python,最近复习了一下,写一个停车场的实现 ,代码如下,所有的需求实现都在注释中 ** show code** #!/usr/bin/env python # ╭╮__╭╭╭╭╭__╭╮ ...

  7. python磁盘io_Python多线程同步、互斥锁、死锁

    接着上篇多线程继续讲,上篇最后的多线程共享全局变量对变量的处理值出错在本文中给出解决方案. 出现这个情况的原因是在python解释器中GIL全局解释器锁. GIL:全局解释器锁,每个线程在执行的过程都 ...

  8. python线程同步锁_Python实现的多线程同步与互斥锁功能示例

    本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading i ...

  9. python同步锁和互斥锁的区别_Python实现的多线程同步与互斥锁功能示例

    本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading i ...

最新文章

  1. 服务器远程管理app,用什么软件远程管理服务器最好? - 选择攻略!
  2. 经典C语言程序100例之四
  3. 查找数组B中不在数组A中的元素
  4. C++工作笔记-在项目中解决编码问题小技巧
  5. 【数据结构】----C语言实现栈操作
  6. Mac OS 搭建phonegap开发环境
  7. mysql主从复制不同步案例_mysql主从复制不同步的问题
  8. 汇编语言Loop指令
  9. IDM2018年最新版破解方法
  10. 电脑使用变慢七大原因全解析
  11. 机器学习为什么也可以像人一样认识cang老师
  12. python Selenium
  13. 解决 java.lang.RuntimeException: Method i in android.util.Log not mocked. See http://g.co/androidstudi
  14. 用python爬取网易云评论最多的歌_巧用Python爬取网易云音乐歌曲全部评论
  15. Unity 旋转人物在设定的角度看向镜头(平滑转动)
  16. 8月22-23日 【广州】《社区商业项目开发定位、规划、招商、运营与模式创新》
  17. C语言/C++编程学习:C语言环境设置
  18. svn分支介绍和使用
  19. 招商银行2022FinTech数据赛道总结
  20. android 自定义apk名,Android Studio 打包自定义apk文件名

热门文章

  1. 程序员如何面试才能拿到offer
  2. window-memcache技术随笔
  3. 【好程序员笔记分享】C语言之break和continue
  4. 从如何优化SQL入手,提高数据仓库的ETL效率
  5. Entity Framework 简单增删改操作
  6. 将Linux加入Windows域
  7. P2680 运输计划
  8. Server.MapPath()的用法
  9. 损失函数(Loss function) 和 代价函数(Cost function)
  10. eclipse新发现功能之dos和terminal(ssh连接)