进程之间共享数据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 ...
随机推荐
- 【转帖】一篇文章让你了解灾备指标:RPO与RTO
RTO 和 RPO 都是企业灾难恢复(Disaster Recovery, DR)需要考虑的关键指标,这两个指标可以用来指导企业来制定合适的业务系统服务或数据的恢复方案. RPO(Recovery P ...
- echarts 设置legend样式
设置legend样式 legend: { x: 'center', data: ['班车', '包车'], icon: "circle", // 这个字段控制形状 类型包括 cir ...
- 【JS 逆向百例】建筑市场监管平台企业数据
声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关. 逆向目标 目标:住房和城乡建设部&全国建筑市场监管公共服务平台的企业数据 主页:http: ...
- 【JS 逆向百例】网洛者反爬练习平台第五题:控制台反调试
关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...
- gRPC with JWT
在 gRPC 中使用 JWT(JSON Web Tokens)进行身份验证是一种常见的做法,它可以帮助你确保请求方的身份和权限.下面是一种使用 gRPC 和 JWT 进行身份验证的步骤: 生成和签发 ...
- TienChin 活动管理-工程创建
工程模块的创建,与之前创建渠道管理一样的,所以这里就不贴图带着大家一起动手进行了,表结构我已经给到大家了,这里我只贴一下代码生成器的代码部分即可. @Test void generateActivit ...
- 新来的一个同事,把SpringBoot参数校验玩的那叫一个优雅
介绍 在开发现代应用程序时,数据验证是确保用户输入的正确性和应用程序数据完整性的关键方面.Spring Boot 提供了强大的数据验证机制,使开发者能够轻松地执行验证操作.本文将深入介绍 Spring ...
- Python下的三维建模和可视化
本文介绍基于AnyCAD Rapid Py三维图形平台开发Python的三维应用 1 准备工作 1.1 安装 vc_resit 2022 在Windows下,AnyCAD Rapid SDK依赖Vis ...
- 基于.NET实现Matlab备用方案
基于.NET实现Matlab备用方案 今日圈内的朋友都在刷这样的消息: 正值哈工大百年校庆之际,哈工大.哈工程的师生收到了MATLAB软件停止服务的邮件,在与 MATLAB 开发公司 MathWork ...
- 云计算 - 对象存储服务OSS技术全解
本文全面深入地探讨了对象存储服务(OSS)的核心技术.基础知识和高级功能.从媒体存储到数据备份,再到数据仓库与数据湖,我们不仅解析了OSS在各种应用场景下的关键角色,还深入讨论了其与机器学习.多媒体处 ...