一、多线程同步

由于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 time

num = 0

lock = threading.Lock()

def func(st):

global num

print (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 += 1

time.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 time

logging.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()。

python线程安全的计数器_Python多线程同步Lock、RLock、Semaphore、Event实例相关推荐

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

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

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

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

  3. python线程停止后重启_python 多线程重启方法

    python 多线程程序运行中,会出现由于异常而导致某线程停止的情况,为了保证程序的稳定运行,需要自动重启down掉的线程. python Threading类有一个setName()的方法,可以为线 ...

  4. Python|线程和进程|阻塞|非阻塞|同步|异步|生成器和协程|资源竞争|进程间通信|aiohttp库|daemon属性值详解|语言基础50课:学习(11)

    文章目录 系列目录 原项目地址 第34课:Python中的并发编程-1 线程和进程 多线程编程 使用 Thread 类创建线程对象 继承 Thread 类自定义线程 使用线程池 守护线程 资源竞争 G ...

  5. python多线程读取文件的问题_Python多线程同步---文件读写控制方法

    1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res ...

  6. python 多线程读写文件_Python多线程同步---文件读写控制方法

    1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res ...

  7. python 多线程读写文件_python多线程同步之文件读写控制

    本文实例为大家分享了python多线程同步之文件读写控制的具体代码,供大家参考,具体内容如下 1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env pyth ...

  8. PYTHON线程知识再研习F---队列同步Queue

    让我们考虑更复杂的一种场景:产品是各不相同的.这时只记录一个数量就不够了,还需要记录每个产品的细节.很容易想到需要用一个容器将这些产品记录下来. Python的Queue模块中提供了同步的.线程安全的 ...

  9. python线程安全的计数器_+ =运算符在Python中是线程安全的吗?

    + =运算符在Python中是线程安全的吗? 我想为实验创建一个非线程安全的代码块,这些是2个线程将要调用的函数. c = 0 def increment(): c += 1 def decremen ...

最新文章

  1. mysql在线上建索引,mysql 5.6在线DDL建索引测试
  2. 无监督机器学习中,最常见4类聚类算法总结 | 技术头条
  3. 手把手教你搭建Linux开发环境(VMware+Ubuntu)(四)——gcc编译器的安装和使用
  4. git 恢复被覆盖本地提交内容
  5. 【Python】远离 Python 最差实践,避免挖坑
  6. IDEA使用技巧整理
  7. Exchange日志
  8. 疯狂html5+css3+javascript讲义 pdf_成为一名优秀的HTML5前端工程师需要掌握哪些技能?...
  9. Eclipse 安装插件报错:An error occurred while collecting items to be installed session context was...解决方法汇总
  10. 本田da屏怎么进wince系统_本田新XR-V首试:配置提升,依然好开
  11. 大学学python用记笔记吗_学 Python 作笔记,怎么能不用 Jupyter
  12. 怎么使用starwind部署iscsi_服务器配置我该怎么选
  13. c++图书管理系统_我用Python帮学校写了一款图书管理系统!教导员居然请我吃饭
  14. 基于RV1126平台imx291分析 --- 总结
  15. 熊猫烧香源码--假的:)
  16. python读取TXT、CSV、xml
  17. Vmstat命令详解
  18. 手机APP/小程序微模卡源码下载,开源开心免费开心
  19. java实现dwg转pdf
  20. PMP考试冲刺敏捷专题

热门文章

  1. call 和 apply 的使用
  2. JavaScript 的 Date 方法的使用
  3. php 高效缓存类,简单高效的文件缓存php类
  4. normalize函数_Pandas 数据处理(一) —— 几个简单函数掌握!
  5. 流浪地球开机动画包zip_【文娱热点】流浪地球2定档2023大年初一;迪士尼计划裁员32000人...
  6. vue 过滤器 filters
  7. C语言入门I love China,C语言从入门到精通
  8. 反编译后怎么修改服务器地址,反编译后怎么修改服务器地址
  9. Java泛型初探————泛型通配
  10. PostMan 四种常见的 POST 提交数据方式