线程锁,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 ...
随机推荐
- 利用系统自带工具快速实现SSH免密远程登录
一.软件环境 操作系统:CentOS Linux release 7.4.1708 (Core) SSH版本 [root@Geeklp201 ~]# ssh -V OpenSSH_7.4p1, Ope ...
- Bootstrap3.0学习(一)
Bootstrap是Twitter退出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架.Bootstra ...
- 平衡二叉树 JAVA实现 亲测可用
平衡二叉树的JAVA实现 亲测可用 包括LL LR RL RR四种情况的旋转算法 以及添加删除树结点之后对平衡二叉树的维护算法 都已经实现并测试过 没有问题. 代码地址可以直接上我的GIT clone ...
- 前后端分离时代,Java 程序员的变与不变!
事情的起因是这样的,有个星球的小伙伴向邀请松哥在知乎上回答一个问题,原题是: 前后端分离的时代,Java后台程序员的技术建议? 松哥认真看了下这个问题,感觉对于初次接触前后端分离的小伙伴来说,可能都会 ...
- laravel-admin(自定义表单与验证)
场景: 很多时候,由于我们业务场景比较特殊,需要自定义表单,然后框架给我提供了对应表单组建! 案列:以创建一个字段为列 1.在控制器对应的方法中调用表单组建创建表单 public function c ...
- 建立自己composer私有仓库
创建仓库地址以gitee为例,主要github太慢 本地建立一个项目目录,然后初始化 composer init 然后根路径下创建src/util目录 修改composer.json,设置autolo ...
- Python解释器安装教程以及环境变量配置
Python3.6安装 打开官网:http://www.python.org,下载python3.6.如下图: 下载完成后进行安装.如下图: 验证环境是否配置成功 打开cmd,输入python,按回车 ...
- 小范笔记:ASP.NET Core API 基础知识与Axios前端提交数据
跟同事合作前后端分离项目,自己对 WebApi 的很多知识不够全,虽说不必要学全栈,可是也要了解基础知识,才能合理设计接口.API,方便与前端交接. 晚上回到宿舍后,对 WebApi 的知识查漏补缺, ...
- CentOS 7 使用 HP 打印机
通常 hp 打印机应该是直接就能用的,但 centos 7 就一直遇到 printing job stopped 的情况.查看 http://localhost:631/printers/ 并没什么用 ...
- Codeforces 1133E - K Balanced Teams - [DP]
题目链接:https://codeforces.com/contest/1133/problem/C 题意: 给出 $n$ 个数,选取其中若干个数分别组成 $k$ 组,要求每组内最大值与最小值的差值不 ...