进程之间共享数据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 ...
随机推荐
- [转帖]Kafka 核心技术与实战学习笔记(六)kafka线上集群部署方案
一.操作系统-Linux Kafka是JVM系的大数据框架 kafka由Scala语言和Java语言编写而成,编译之后的源代码就是普通的".class"文件 使用Linux kaf ...
- [转帖]Linux命令学习手册-readelf
https://www.jianshu.com/p/405844abefae readelf elf-file(s) 功能 用于显示 elf 格式文件的信息. 描述 readelf 用来显示一个或者多 ...
- [转帖]Linux使用Stress-ng测试CPU、内存、磁盘I/O满载情况教程与范例
https://www.xiaoyuanjiu.com/108301.html 介绍如何在 Linux 系统上使用 stress-ng 负载测试工具,产生 CPU.内存等资源满载的状况. stress ...
- Oracle 修改参数
alter system set sga_max_size=30720M scope=spfile; alter system set sga_target=30720M; alter system ...
- vim 从嫌弃到依赖(18)——查找模式进阶
上一篇文章中,我们初步结识了如何使用查找模式,也能够通过n和 N进行查找.这篇将会介绍搜索中更高级的用法.另外在写上一篇文章的时候我发现介绍查找相关内容的时候不能用动图来演示,主要是因为输入的内容太多 ...
- SqlSugar导航查询/多级查询
1.导航查询特点 作用:主要处理主对象里面有子对象这种层级关系查询 1.1 无外键开箱就用 其它ORM导航查询 需要 各种配置或者外键,而SqlSugar则开箱就用,无外键,只需配置特性和主键就能使用 ...
- 14.7 Socket 循环结构体传输
在上述内容中笔者通过一个简单的案例给大家介绍了在套接字编程中如何传递结构体数据,本章将继续延申结构体传输,在某些时候例如我们需要传输一些当前系统的进程列表信息,或者是当前主机中的目录文件,此时就需要使 ...
- 【scikit-learn基础】--『分类模型评估』之系数分析
前面两篇介绍了分类模型评估的两类方法,准确率分析和损失分析,本篇介绍的杰卡德相似系数和马修斯相关系数为我们提供了不同的角度来观察模型的性能,尤其在不平衡数据场景中,它们更能体现出其独特的价值. 接下来 ...
- 【链表】链表OJ-力扣2074. 反转偶数长度组的节点【超详细的算法解释】
说在前面 今天博主给大家带来的是力扣上的一道链表OJ,完成这道题后,博主感觉这题覆盖了很多链表的解题思想,另外,这道题对指针的控制也是比较高的.在这里博主将这道好题分享给大家! 另外,对于链表等数据结 ...
- 目录:CH57x/CH58x/CH59x/CH32V208低功耗蓝牙应用
外设相关: CH59x 系统16位PWM使用 - 小舟从此逝_1 - 博客园 (cnblogs.com) CH59X/CH58X/CH57X PWM使用 - 小舟从此逝_1 - 博客园 (cnblog ...