python 线程池 锁_python 线程池和锁
一.死锁现象与递归锁
锁:Lock线程安全,多线程操作时,内部会让所有线程排队处理。如:list/dict/Queue
线程不安全 + 人 => 排队处理。
importthreadingimporttime
v=[]
lock=threading.Lock()deffunc(arg):
lock.acquire()
v.append(arg)
time.sleep(0.01)
m= v[-1]print(arg,m)
lock.release()for i in range(10):
t=threading.Thread(target=func,args=(i,))
t.start()
锁:RLock
importthreadingimporttime
v=[]
lock=threading.RLock()deffunc(arg):
lock.acquire()
lock.acquire()
v.append(arg)
time.sleep(0.01)
m= v[-1]print(arg,m)
lock.release()
lock.release()for i in range(10):
t=threading.Thread(target=func,args=(i,))
t.start()
锁:BoundedSemaphore
importtimeimportthreading
lock= threading.BoundedSemaphore(3)deffunc(arg):
lock.acquire()print(arg)
time.sleep(1)
lock.release()for i in range(20):
t=threading.Thread(target=func,args=(i,))
t.start()
锁:condition
importtimeimportthreading
lock=threading.Condition()############### 方式一 ##############
deffunc(arg):print('线程进来了')
lock.acquire()
lock.wait()#加锁
print(arg)
time.sleep(1)
lock.release()for i in range(10):
t=threading.Thread(target=func,args=(i,))
t.start()whileTrue:
inp= int(input('>>>'))
lock.acquire()
lock.notify(inp)
lock.release()############### 方式二 ##############
"""def xxxx():
print('来执行函数了')
input(">>>")
# ct = threading.current_thread() # 获取当前线程
# ct.getName()
return True
def func(arg):
print('线程进来了')
lock.wait_for(xxxx)
print(arg)
time.sleep(1)
for i in range(10):
t =threading.Thread(target=func,args=(i,))
t.start()"""
锁:Event
importtimeimportthreading
lock=threading.Event()deffunc(arg):print('线程来了')
lock.wait()#加锁:红灯
print(arg)for i in range(10):
t=threading.Thread(target=func,args=(i,))
t.start()
input(">>>>")
lock.set()#绿灯
lock.clear()#再次变红灯
for i in range(10):
t=threading.Thread(target=func,args=(i,))
t.start()
input(">>>>")
lock.set()
二.threading.local 的作用及原理
作用:内部自动为每个线程维护一个空间(字典),用于存取属于自己的值.保证线程之间的数据隔离.
importtimeimportthreading
v=threading.local()deffunc(arg):#内部会为当前线程创建一个空间用于存储:phone=自己的值
v.phone =arg
time.sleep(2)print(v.phone,arg) #去当前线程自己空间取值
for i in range(10):
t=threading.Thread(target=func,args=(i,))
t.start()
原理:
#原理1
importtimeimportthreading
DATA_DICT={}deffunc(arg):
ident=threading.get_ident()
DATA_DICT[ident]=arg
time.sleep(1)print(DATA_DICT[ident],arg)for i in range(10):
t=threading.Thread(target=func,args=(i,))
t.start()#原理2
importtimeimportthreading
INFO={}classLocal(object):def __getattr__(self, item):
ident=threading.get_ident()returnINFO[ident][item]def __setattr__(self, key, value):
ident=threading.get_ident()if ident inINFO:
INFO[ident][key]=valueelse:
INFO[ident]={key:value}
obj=Local()deffunc(arg):
obj.phone= arg #调用对象的 __setattr__方法(“phone”,1)
time.sleep(2)print(obj.phone,arg)for i in range(10):
t=threading.Thread(target=func,args=(i,))
t.start()
三.线程池
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
from concurrent.futures importThreadPoolExecutorimporttimedeftask(a1,a2):
time.sleep(2)print(a1,a2)#创建了一个线程池(最多5个线程)
pool = ThreadPoolExecutor(5)for i in range(40):#去线程池中申请一个线程,让线程执行task函数。
pool.submit(task,i,8)
四.生产者消费者模型
产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者;生产者和消费者之间的中介就叫做缓冲区。
importtimeimportqueueimportthreading
q= queue.Queue() #线程安全
defproducer(id):"""生产者
:return:"""
whileTrue:
time.sleep(2)
q.put('包子')print('厨师%s 生产了一个包子' %id )for i in range(1,4):
t= threading.Thread(target=producer,args=(i,))
t.start()defconsumer(id):"""消费者
:return:"""
whileTrue:
time.sleep(1)
v1=q.get()print('顾客 %s 吃了一个包子' %id)for i in range(1,3):
t= threading.Thread(target=consumer,args=(i,))
t.start()
python 线程池 锁_python 线程池和锁相关推荐
- python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...
GIL锁 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...
- python多线程队列处理_Python线程和队列使用的一点思考
Python线程和队列使用的一点思考 1. 斗哥采访环节请问为什么要使用线程? 答:为了提高程序速度,代码效率呀. 请问为什么要使用队列? 答:个人认为队列可以保证线程安全,实现线程间的同步,比较稳. ...
- python timer详解_python线程定时器Timer实现原理解析
这篇文章主要介绍了python线程定时器Timer实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.线程定时器Timer原理 原理比较 ...
- python 定时器实现原理_python线程定时器Timer实现原理解析
这篇文章主要介绍了python线程定时器Timer实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.线程定时器Timer原理 原理比较 ...
- python全局解释锁_Python GIL 全局解释性锁介绍
什么是GIL GIL (Global Interpreter Lock),全局解释性锁,它上锁的对象是解释器,而Python代码的运行需要解释器进行解释成字节码并提供虚拟机运行,这么大粒度的锁意味着, ...
- python gil锁_python中的GIL锁
熟悉python的都知道,在C语言写的python解释器中存在全局解释器锁,由于全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能.而这个 ...
- python线程池操作_python线程池和进程池
线程池和进程池 开局来张图 使用线程池的好处 1.提升性能:因为减去了大量新建.终止线程的开销,重用了线程资源 2.使用场景:适合处理突发性大量请求或需要大量线程完成任务.但实际任务处理时间较短 3. ...
- python 线程池用法_python 线程池 ThreadPoolExecutor 的用法
1. 线程池的基本用法 # coding: utf-8 from concurrent.futures import ThreadPoolExecutor import time def spider ...
- python 进程池不足_python 进程池pool简单使用
平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ' ...
- python 异步 生产者 消费者_python 线程通信 生产者与消费者
1 """ 2 线程通信的生产者与消费者3 python的queue模块中提供了同步的线程安全的队列类,都具有原子性,实现线程间的同步4 Queue (FIFO: fis ...
最新文章
- ServiceStack OrmLite 数据库查询 几个实用方法 (继承表格式化集合等)
- .NET基础 (05)内存管理和垃圾回收
- c语言找最长串指针改错,全国计算机二级C语言上机 (改错题)【DOC精选】.doc
- python 中的路径. ./ .. ../和相对路径的写法
- boost::hana::fix用法的测试程序
- Blazor VS React / Angular / Vue.js
- 前端学习(2254)team怎么接受到pr
- micropython mqtt 重连_ESP32/ESP8266使用MicroPython利用MQTT发布DHT11/DHT22传感器数据
- 和运营开会的知道的一些点
- 执行下面程序段后,y的结果是____。int x,y;x=y=2;x=x-2(y=y+1);printf(“%d“,y);A。3 B.2 C.1 D。0
- mybatis 报错. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #2 wit
- 电脑未安装任何音频设备解决办法
- 镜头、CCD芯片、视场、物距之间的关系
- python打九九乘法表上三角下三角_python经典练习题之九九乘法表、打印菱形、打印对顶三角形、斐波拉契数列、素数......
- SIP/VoIP之常见的语音问题
- ICC---data setup
- Word字体的字号与像素对应关系
- 电瓶车测试速度的软件,多种防测神器悄悄兴起电动车超速要被罚有人竟打起歪心思...
- Python3 HyperLPR 中文车牌识别
- Ubuntu 18.04 安装ns-3.30