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的更多相关文章

  1. Python 进程之间共享数据

    最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享  在mp库当中,跨进程对象共享有三种方式,第一种 ...

  2. Python 进程之间共享数据(全局变量)

    进程之间共享数据(数值型): import multiprocessing def func(num): num.value=10.78 #子进程改变数值的值,主进程跟着改变 if __name__= ...

  3. VC++共享数据段实现进程之间共享数据

    当我写了一个程序,我希望当这个程序同时运行两遍的时候,两个进程之间能共享一些全局变量,怎么办呢?很简单,使用VC\VC++的共享数据段.; #pragma data_seg()//恢复到正常段继续编程 ...

  4. python进程之间修改数据[Manager]与进程池[Pool]

    #前面的队列Queue和管道Pipe都是仅仅能再进程之间传递数据,但是不能修改数据,今天我们学习的东西就可以在进程之间同时修改一份数据 #Mnager就可以实现 import multiprocess ...

  5. 进程间共享数据Manager

    一.前言 进程间的通信Queue()和Pipe(),可以实现进程间的数据传递.但是要使python进程间共享数据,我们就要使用multiprocessing.Manager. Manager()返回的 ...

  6. day33:进程锁&事件&进程队列&进程间共享数据

    目录 1.锁:Lock 2.信号量:Semaphone 3.事件:Event 4.进程队列:Queue 5.生产者和消费者模型 6.JoinableQueue 7.Manager:进程之间共享数据 锁 ...

  7. 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)

    ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...

  8. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  9. 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)

    多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码 ...

  10. Python multiprocessing.Manager介绍和实例(进程间共享数据)

    Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装.使用multiprocessing.Manager可以简单地使用这些高级接口. Mana ...

随机推荐

  1. 【转帖】Meta 推出大型语言模型 LLaMA,比 GPT3.5 性能更高

    https://finance.sina.com.cn/wm/2023-02-28/doc-imyihfvp8075151.shtml ChatGPT 的爆火使得大家对 AI 进行了深度的讨论,大厂们 ...

  2. [转帖]超线程 Smt 究竟可以快多少?

    https://www.51cto.com/article/686171.html 刚才我们关闭SMT是把CPU10-CPU19全关了,只留下每对里面的1个CPU,也就是留下了CPU0-CPU9. 默 ...

  3. [转帖]龙芯总强调同频性能,是因奔腾4要到25+GHz才比得上酷睿11代单核

      https://baijiahao.baidu.com/s?id=1734320620568707041 闲话不说,先上图,是SPEC CPU 2006 int(单任务)测试的成绩: 上图中的成绩 ...

  4. [转帖]Red Hat Enterprise Linux 8 和 9 中可用的 IO 调度程序

    Red Hat 弃用了 Red Hat Enterprise Linux 7 中可用的 I/O 调度程序,并引入了四个新的 I/O 调度程序,如下所示, 运行以下命令检查 RHEL8 和 RHEL9 ...

  5. Springboot数据库连接池的学习与了解

    背景 昨天学习总结了tomcat的http连接池和线程池相关的知识,总结的不是很完整, 自己知道的也比较少,总结的时候就在想tomcat针对client 端有连接池,并且通过NIO的机制, 以较少的t ...

  6. 行云部署成长之路--慢SQL优化之旅 | 京东云技术团队

    ​ 当项目的SQL查询慢得像蜗牛爬行时,用户的耐心也在一点点被消耗,作为研发,我们可不想看到这样的事.这篇文章将结合行云部署项目的实践经验,带你走进SQL优化的奇妙世界,一起探索如何让那些龟速的查询飞 ...

  7. 佳能F-789SGA升级与超频——互联网Tips存档

    佳能F-789SGA简介 佳能F-789SGA是一款性价比极高的科学函数计算器,功能与卡西欧fx-991ES近似,稍强于991ES,弱于991CNX. 来自電卓院亜紀良的评价 来自杨高峰的对比总结 来 ...

  8. Gin 框架介绍与快速入门

    Gin 框架介绍与快速入门 目录 Gin 框架介绍与快速入门 一.Gin框架介绍 1. 快速和轻量级 2. 路由和中间件 3. JSON解析 4. 支持插件 5. Gin相关文档 二.基本使用 1.安 ...

  9. 从零开始匹配vim(1)——选项设置

    前面我们算是对 vimscript 做了一个入门,并且实现了一个 输出 hello world 的语句.现在我们继续进行 vimscript 的学习. set语句 之前在介绍 vim 基础的时候,我们 ...

  10. 深度学习应用篇-计算机视觉-视频分类[8]:时间偏移模块(TSM)、TimeSformer无卷积视频分类方法、注意力机制

    深度学习应用篇-计算机视觉-视频分类[8]:时间偏移模块(TSM).TimeSformer无卷积视频分类方法.注意力机制 1.时间偏移模块(TSM) 视频流的爆炸性增长为以高精度和低成本执行视频理解任 ...