线程锁,threadinglocal,线程池,生产者消费者模型
1.线程锁
1.锁Lock(只能锁一次)
import threading
import time v = []
lock = threading.Lock() def func(arg):
lock.acquire()
v.append(arg)
time.sleep(1)
m = v[-1]
print(arg,m)
lock.release() for i in range(10):
t = threading.Thread(target=func,args=(i,))
t.start()
2.锁RLock(可以锁多次)
import threading
import time v = []
lock = threading.RLock() def func(arg):
lock.acquire()
lock.acquire() v.append(arg)
time.sleep(1)
m = v[-1]
print(arg,m) lock.release()
lock.release() for i in range(10):
t = threading.Thread(target=func,args=(i,))
t.start()
3.锁semaphore(一次放n个)
import threading
import time lock = threading.BoundedSemaphore(3)#一次放三个 def func(arg):
lock.acquire() print(arg)
time.sleep(2) lock.release() for i in range(20):
t = threading.Thread(target=func,args=(i,))
t.start()
4.锁Condition(一次放指定个数)
import time
import threading lock = threading.Condition() #方式一 def func(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() while True:
num = int(input(">>>"))
lock.acquire()
lock.notify(num)
lock.release() #方式二 def func():
print("来执行函数了")
input(">>>")
ct = threading.current_thread()#获取当前线程
ct.getName()
return True def func1(arg):
print("线程进来了")
lock.wait_for(func)
print(arg)
time.sleep(1) for i in range(10):
t = threading.Thread(target=func1,args=(i,))
t.start()
5.锁Event(一次放所有)
import time
import threading lock = threading.Event() def func(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(target=func,args=(i,))
t.start() input(">>>")
lock.set()
2.threadinglocal
import time
import threading v = threading.local() def func(arg):
#内部会为当前线程创建一个空间用于存储
v.local = arg
time.sleep(2)
print(v.local,arg)#去当前线程自己的空间取值 for i in range(10):
t = threading.Thread(target=func,args=(i,))
t.start()
threadinglocal原理
import time
import threading data_dict = {} def func(arg):
ident = threading.get_ident()
data_list[ident] = arg
time.sleep(1)
print(data_dict[ident],arg) for i in range(10):
t = threading.Thread(target=func,args=(i,))
t.start()
import time
import threading info = {} class Local(object): def __getattr__(self,item):
ident = threading.get_ident()
return info[ident][item] def __setattr__(self,key,value):
ident = threading.get_ident()
if ident in info:
info[ident][key] = value
else:
info[ident] = {key:value} obj = Local() def func(arg):
obj.local = arg#调用对象的__setattr__方法
time.sleep(1)
print(obj.local,arg) for i in range(10):
t = threading.Thread(target=func,args=(i,))
t.start()
3.线程池
from concurrent.futures import ThreadPoolExecutor
import time def task(a1,a2):
time.sleep(2)
print(a1,a2) #创建一个线程池(最多五个线程)
pool = ThreadPoolExecutor(5) for i in range(100):
#去线程池申请一个线程,让线程执行task函数
pool.submit(task,i,10)
4.生产者消费者模型
import time
import queue
import threading q = queue.Queue()#线程安全 def producer(id):
while True:
time.sleep(1)
q.put("")
print("生产了一个%s"% id) for i in range(1,4):
t = threading.Thread(target=func,args=(i,))
t.start() def consumer(id):
while True:
time.sleep(1)
v1 = q.get()
print("消费了一个%s"% id) for i in range(1,3):
t = threading.Thread(target=consumer,args=(i,))
t.start()
线程锁,threadinglocal,线程池,生产者消费者模型的更多相关文章
- [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]
		[并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ... 
- day34 python学习  守护进程,线程,互斥锁,信号量,生产者消费者模型,
		六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ... 
- 守护、互斥锁、IPC和生产者消费者模型
		守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are ... 
- 4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型
		一.守护进程 import random import time from multiprocessing import Process def task(): print('name: egon') ... 
- 进程Queue、线程Queue、堆栈、生产者消费者模型
		没学队列之前,可以用文件实现进程之间通信 但是有2个问题: 1. 速度慢:文件是保存在硬盘空间 2. 为了数据安全要加锁(处理锁是一件很麻烦的事,容易死锁,建议自己轻易不要处理锁) 队列:队列是基于管 ... 
- 线程锁、threading.local(flask源码中用的到)、线程池、生产者消费者模型
		一.线程锁 线程安全,多线程操作时,内部会让所有线程排队处理.如:list/dict/Queue 线程不安全 + 人(锁) => 排队处理 1.RLock/Lock:一次放一个 a.创建10个线 ... 
- 锁丶threading.local丶线程池丶生产者消费者模型
		一丶锁 线程安全: 线程安全能够保证多个线程同时执行时程序依旧运行正确, 而且要保证对于共享的数据,可以由多个线程存取,但是同一时刻只能有一个线程进行存取. import threading v = ... 
- python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)
		python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ... 
- 进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型
		一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: import param ... 
随机推荐
- qt 维护x86和arm两套编译环境
			1.中间库: 中间库都放在middlewares目录,include头文件相同,所以不需要特殊处理,只要特殊处理lib安装目录, 示例pro文件如下: TEMPLATE = lib TARGET = ... 
- 最短JS判断IE6/IE7/IE8系列的写法
			常用的 var isIE=!!window.ActiveXObject; var isIE6=isIE&&!window.XMLHttpRequest; var isIE8=isIE& ... 
- SYN591-B型 转速表
			SYN591-B型 转速表 光电转速表数显转速表智能转速表使用说明视频链接: http://www.syn029.com/h-pd-249-0_310_44_-1.html 请将此链接复制到浏览 ... 
- Tuxera NTFS 2018 for Mac中文破解版 U盘读写软件-让你的Mac支持NTFS
			下载链接(复制到浏览器下载):http://h5ip.cn/TLMc 软件介绍 给大家带来一款苹果Mac上如何使用U盘读写的软件,Tuxera NTFS 2018 for Mac中文破解版,Mac O ... 
- 9个WebGL的演示
			1. WebGL Water This incredible demo is as fluid as you could believe. Raise and drop the ball into ... 
- SpringBoot从入门到精通十一(SpringBoot文件上传的两种方法)
			前言 在企业级项目开发过程中,上传文件是最常用到的功能.SpringBoot集成了SpringMVC,当然上传文件的方式跟SpringMVC没有什么出入. 本章目标 使用SpringBoot项目完成单 ... 
- Binary classification - 聊聊评价指标的那些事儿【实战篇】
			分类问题就像披着羊皮的狼,看起来天真无害用起来天雷滚滚.比如在建模前你思考过下面的问题么? 你的分类模型输出的概率只是用来做样本间的相对排序,还是概率本身? 你的训练数据本身分布如何是否存在Imbal ... 
- Java 添加、修改PPT幻灯片中的表格
			本文将介绍通过Java编程在PPT操作表格的方法.包括添加表格到PPT幻灯片,并设置表格样式.单元格对齐方式.单元格背景色.边框样式.字体.字号.合并单元格等:同时,通过加载已有表格的幻灯片也可以对表 ... 
- webpack中添加px2rem-loader
			在buid->util.js const px2remLoader = { loader: 'px2rem-loader', options: { remUnit: 75 } } // gene ... 
- python 基础学习笔记(3)--列表与元组
			**本次笔记主要内容为 列表,元组主要的功能和特性** **1.列表**: 学习过c语言的同学应该知道,c语言有数组这一功能,就是将数据类型相同的元素放在一起.由于python的变量没有数据类型,也就 ... 
