进程之间共享数据Manager,线程相关使用Thread,用类定义线程,守护线程setDaemon,线程锁Lock,线程信号量Semaphore---day32
1.Manager
# ### Manager (list列表,dict字典)进程之间的共享数据(列表或字典等)
from multiprocessing import Process,Manager,Lock def work(data):
'''
#正常写法
lock.acquire()
#data['count'] -= 1
data[0] += 1
lock.release()
''' # 使用with 语法简化上锁解锁操作
with lock:
data[0] +=1 if __name__ == '__main__':
m = Manager()
data = m.dict({"count":2000})
date = m.list([1,2,3])
#print(data) lst = []
for i in range(100):
p = Process(target=work,args=(data,))
p.start()
lst.append(p) #确保所有的进程执行完毕,然后再向下运行,打印数据,否则报错
for i in lst:
i.join() print(data) #[101,2,3]
#print(data) #{'count':19900}
2.线程的使用
from threading import Thread
from multiprocessing import Process
import os,time #(1) 一份进程资源中可以包含多个线程
def func(num):
print("当前线程,所归属的进程id",os.getpid(),num) for i in range(10)
#(基于当前这个主进程创建了10个子线程,然后主进程本身就自带一个线程,一共11个)
t = Thread(target=func,args=(i,)) #创建线程跟进程对象用法一样,返回一个线程对象
t.start() #(2) 并发的多进程和多线程,谁的速度更快
def func(num):
print("当前线程,所归属的进程id",os.getpid(),num) if __name__ == '__main__':
#统计1000个线程的运行时间
#记录时间
starttime = time.time()
lst = []
for i in range(1000):
t = Thread(target=func,args=(i,))
t.start()
lst.append(t)
#确保所有线程执行完毕
for i in lst:
i.join()
#结束时间
endtime = time.time()
print('执行的时间是{}'.format(endtime-starttime)) #统计1000个进程的运行时间
#记录时间
starttime = time.time()
lst = []
for i in range(1000):
p = Process(target=func,args=(i,))
p.start()
lst.append(p)
#确保所有线程执行完毕
for i in lst:
i.join()
#结束时间
endtime = time.time()
print('执行的时间是{}'.format(endtime-star #(3)多线程共享同一份进程资源
num = 1000
def func():
global num
num -= 1 for i in range(1000):
t = Thread(target=func)
t.start()
3.用类定义线程
# ### 用类定义线程
from threading import Thread
import time
from threading import currentThread class MyThread(Thread): #继承父类
def __init__(self,name): #传参初始化的时候需要调用父类的构造方法
super().__init__()
self.name = name def run(self): #一定是run,不能乱写
#time.sleep(1)
print("当前进程正在执行running...",self.name) if __name__ =='__main__':
t = MyThread('机器会爆炸吗')
t.start()
print("主线程执行结束...") # ### 线程的一些相关函数
#线程.is_alive() #检测线程是否仍然存在
#线程.setName() #设置线程名字
#线程.getName() #获取线程名字
#1.currentThread().ident 查看线程id号
#2.enumerate() 返回目前正在运行的线程列表
#3.activeCount() 返回目前正在运行的线程数量 def func():
time.sleep(1) if __name__ == '__main__':
t = Thread(target=func)
#print(t)
t.start()
print(t)
print(t.is_alive()) #False
print(t.getName())
t.setName("xboyww")
print(t.getName()) #1.currentThread().ident 查看线程id号
def func():
print("子线程id",currentThread().ident,os.getpid()) if __name__ == '__main__':
Thread(target=func).start()
print("主线程id",currentThread().ident,os.getpid()) #2.enumerate() 返回目前正在运行的线程列表
from threading import enumerate
def func():
print("子线程id",currentThread().ident,os.getpid())
time.sleep(0.5)
if __name__ == '__main__':
for i in range(10):
Thread(target=func).start()
print(enumerate()) #3.activeCount() 返回目前正在运行的线程数量
from threading import enumerate
from threading import activeCount
def func():
print("子线程id",currentThread().ident,os.getpid())
time.sleep(0.5)
if __name__ == '__main__':
for i in range(10):
Thread(target=func).start()
lst = enumerate()
#子线程10个,主线程1个 用enumerate也可以返回线程数量
print(lst,len(lst))
#用activeCount()返回线程数量
print( activeCount())
4.守护线程
# ### 守护线程 :等待所有线程全部执行结束,在自己终止,守护所有线程
from threading import Thread
import time
def func1():
while True:
time.sleep(0.5)
print("我是func1") def func2():
print("我是func2 start...")
time.sleep(3)
print("我的func2 end...") t1 = Thread(target=func1)
t2 = Thread(target=func2) #在start调用之前,设置守护线程
t1.setDaemon(True) #守护线程要等待其他所有线程结束后,自己再结束 t1.start()
t2.start()#等待这个结束
print("主线程执行结束...") #等待这个结束
5.线程锁保证数据安全
# ### Lock 保证线程数据安全
from threading import Lock,Thread n = 0 def func1(lock):
global n
lock.acquire()
for i in range(1000000): n -= 1
lock.release() def func2(lock):
global n
with lock:
for i in range(1000000): n += 1
# func1()
# func2()
# print(n) # 0
if __name__ == '__main__':
lst = []
lock = Lock()
for i in range(10):
t1 = Thread(target=func1,args=(lock,))
t2 = Thread(target=func2,args=(lock,))
t1.start()
t2.start()
lst.append(t1)
lst.append(t2)
#等待所有的子线程执行结束之后,在打印数据
for i in lst:
i.join()
print("主线程执行结束...",n)
6.线程信号量Semaphore
# ### 信号量 Semaphore(线程)
from threading import Semaphore,Thread
import time def func(i,sm):
with sm:
print(i)
time.sleep(3) if __name__ == '__main__':
sm = Semaphore(5)
for i in range(20):
Thread(target=func,args=(i,sm)).start() '''
在创建线程的时候是异步创建
在执行任务的时候,因为Semphore加了锁,所以线程之间变成了同步
'''
进程之间共享数据Manager,线程相关使用Thread,用类定义线程,守护线程setDaemon,线程锁Lock,线程信号量Semaphore---day32的更多相关文章
- Python 进程之间共享数据
最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享 在mp库当中,跨进程对象共享有三种方式,第一种 ...
- Python 进程之间共享数据(全局变量)
进程之间共享数据(数值型): import multiprocessing def func(num): num.value=10.78 #子进程改变数值的值,主进程跟着改变 if __name__= ...
- VC++共享数据段实现进程之间共享数据
当我写了一个程序,我希望当这个程序同时运行两遍的时候,两个进程之间能共享一些全局变量,怎么办呢?很简单,使用VC\VC++的共享数据段.; #pragma data_seg()//恢复到正常段继续编程 ...
- python进程之间修改数据[Manager]与进程池[Pool]
#前面的队列Queue和管道Pipe都是仅仅能再进程之间传递数据,但是不能修改数据,今天我们学习的东西就可以在进程之间同时修改一份数据 #Mnager就可以实现 import multiprocess ...
- 进程间共享数据Manager
一.前言 进程间的通信Queue()和Pipe(),可以实现进程间的数据传递.但是要使python进程间共享数据,我们就要使用multiprocessing.Manager. Manager()返回的 ...
- day33:进程锁&事件&进程队列&进程间共享数据
目录 1.锁:Lock 2.信号量:Semaphone 3.事件:Event 4.进程队列:Queue 5.生产者和消费者模型 6.JoinableQueue 7.Manager:进程之间共享数据 锁 ...
- 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案
C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...
- 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)
多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码 ...
- Python multiprocessing.Manager介绍和实例(进程间共享数据)
Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...
随机推荐
- 【转帖】Meta 推出大型语言模型 LLaMA,比 GPT3.5 性能更高
https://finance.sina.com.cn/wm/2023-02-28/doc-imyihfvp8075151.shtml ChatGPT 的爆火使得大家对 AI 进行了深度的讨论,大厂们 ...
- [转帖]超线程 Smt 究竟可以快多少?
https://www.51cto.com/article/686171.html 刚才我们关闭SMT是把CPU10-CPU19全关了,只留下每对里面的1个CPU,也就是留下了CPU0-CPU9. 默 ...
- [转帖]龙芯总强调同频性能,是因奔腾4要到25+GHz才比得上酷睿11代单核
https://baijiahao.baidu.com/s?id=1734320620568707041 闲话不说,先上图,是SPEC CPU 2006 int(单任务)测试的成绩: 上图中的成绩 ...
- [转帖]Red Hat Enterprise Linux 8 和 9 中可用的 IO 调度程序
Red Hat 弃用了 Red Hat Enterprise Linux 7 中可用的 I/O 调度程序,并引入了四个新的 I/O 调度程序,如下所示, 运行以下命令检查 RHEL8 和 RHEL9 ...
- Springboot数据库连接池的学习与了解
背景 昨天学习总结了tomcat的http连接池和线程池相关的知识,总结的不是很完整, 自己知道的也比较少,总结的时候就在想tomcat针对client 端有连接池,并且通过NIO的机制, 以较少的t ...
- 行云部署成长之路--慢SQL优化之旅 | 京东云技术团队
当项目的SQL查询慢得像蜗牛爬行时,用户的耐心也在一点点被消耗,作为研发,我们可不想看到这样的事.这篇文章将结合行云部署项目的实践经验,带你走进SQL优化的奇妙世界,一起探索如何让那些龟速的查询飞 ...
- 佳能F-789SGA升级与超频——互联网Tips存档
佳能F-789SGA简介 佳能F-789SGA是一款性价比极高的科学函数计算器,功能与卡西欧fx-991ES近似,稍强于991ES,弱于991CNX. 来自電卓院亜紀良的评价 来自杨高峰的对比总结 来 ...
- Gin 框架介绍与快速入门
Gin 框架介绍与快速入门 目录 Gin 框架介绍与快速入门 一.Gin框架介绍 1. 快速和轻量级 2. 路由和中间件 3. JSON解析 4. 支持插件 5. Gin相关文档 二.基本使用 1.安 ...
- 从零开始匹配vim(1)——选项设置
前面我们算是对 vimscript 做了一个入门,并且实现了一个 输出 hello world 的语句.现在我们继续进行 vimscript 的学习. set语句 之前在介绍 vim 基础的时候,我们 ...
- 深度学习应用篇-计算机视觉-视频分类[8]:时间偏移模块(TSM)、TimeSformer无卷积视频分类方法、注意力机制
深度学习应用篇-计算机视觉-视频分类[8]:时间偏移模块(TSM).TimeSformer无卷积视频分类方法.注意力机制 1.时间偏移模块(TSM) 视频流的爆炸性增长为以高精度和低成本执行视频理解任 ...