线程锁,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 ...
随机推荐
- 获取原生DOM,diy脚手架,vue-clide使用,element-ui的使用
一.获取原生DOM的方式 给标签或者属性添加ref属性 //1.添加属性 <div ref='shy'><div> <Home ref='home'></Ho ...
- SYN1618型 高精度天文时间同步系统
SYN1618型 高精度天文时间同步系统 产品概述 SYN1618型 高精度天文时间同步系统是由西安同步电子科技有限公司精心设计.自行研发生产的一款高精度的时频频率标准设备,接收GPS.GLON ...
- ORACLE(emp)表习题与答案
因为答案都是小编自己写的,解法可能有多种,如果您觉得我的解法有误,希望您有时间给我留言. 一.习题 (1) 查询20部门的所有员工信息. SELECT * FROM emp where deptno ...
- 《HelloGitHub》第 39 期
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...
- PWN菜鸡入门之栈溢出(1)
栈溢出 一.基本概念: 函数调用栈情况见链接 基本准备: bss段可执行检测: gef➤ b main Breakpoint at . gef➤ r Starting program: /mnt/ ...
- java小数保留位数四舍五入
方法一:四舍五入 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2, Roundin ...
- Python自学day-14
一.默认创建的HTML5文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- [乐意黎原创]Centos 7里apache(httpd)自启动
最近,Aerchi在折腾 ECS服务器 (Centos 7),每次重启后都要手动开启apache服务,好繁琐. 仔细研究了下:Apache 的服务第一.启动.终止.重启systemctl start ...
- 搭建minima主题的github博客网站
layout: post title: "搭建minima主题的github博客网站" date: 2019-04-20 19:20:20 +0800 --- 作者:吴甜甜 个人博 ...
- 浅谈Invoke 和 BegionInvoke的用法
很多人对Invoke和BeginInvoke理解不深刻,不知道该怎么应用,在这篇博文里将详细阐述Invoke和BeginInvoke的用法: 首先说下Invoke和BeginInvoke有两种用法: ...