线程锁,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在MIPS Linux上运行 good
下载 首先下载Qt everywhere,当前的版本是4.7.2,可以从nokia的网站上下载,也可以从git服务器上下载.考虑到文件有200M 以上的大小,下载速率低于25kBPS的,需要考虑从什么 ...
- 在SYSTEM权限下以当前用户权限运行程序
http://download.csdn.net/download/lai444132348/9730266 using System; using System.Runtime.InteropSer ...
- U盘免疫
界面如下: 关键部分代码如下: void CImmunityUDlg::OnBnClickedButtonOk() { // TODO: 在此添加控件通知处理程序代码 TCHAR szPath[MAX ...
- Google C++测试框架系列入门篇:第三章 基本概念
上一篇:Google C++测试框架系列入门篇:第二章 开始一个新项目 原始链接:Basic Concepts 词汇表 版本号:v_0.1 基本概念 使用GTest你肯定会接触到断言这个概念.断言是用 ...
- Codility---BinaryGap
Task description A binary gap within a positive integer N is any maximal sequence of consecutive zer ...
- Geoserver发布Image Mossaic图层
1数据准备:请事先在arcgis desktop软件中将栅格数据拼接完毕,并为每一幅影像生成一个prj文件,坐标系一定是要有的,不然Mossaic图层发布不了. 2."数据存储“->& ...
- vi的替换使用、如何让linux有回收站功能、系统重要文件、目录数据
1 vi的替换使用方法 vi使用的原理 (编辑文件会生成一个隐藏临时文件) 1.1 替换文件内容方法:vi (1)%s#oldboy#oldgirl#g --- 将oldboy全部替换为oldgi ...
- Kafka 学习之路(二)—— 基于ZooKeeper搭建Kafka高可用集群
一.Zookeeper集群搭建 为保证集群高可用,Zookeeper集群的节点数最好是奇数,最少有三个节点,所以这里搭建一个三个节点的集群. 1.1 下载 & 解压 下载对应版本Zookeep ...
- linux 安装 websocketd
1.下载 wget https://github.com/joewalnes/websocketd/releases/download/v0.3.0/websocketd-0.3.0-linux_am ...
- ES5_04_Array扩展
介绍什么是Array对象? # Array 对象用于在单个的变量中存储多个值 1. 创建 Array 对象的语法: 2. Array 对象属性 3. Array 对象方法 补充: 1. Array.p ...