python之路--管道, 事件, 信号量, 进程池
一 . 管道 (了解)
from multiprocessing import Process, Pipe
def f1(conn):
# 管道的recv 里面不用写数字
from_main_process = conn.recv()
print('我是子程序')
print(from_main_process) if __name__ == '__main__':
# 创建一个管道,返回管道的两端conn1 和 conn2 但是只能在一边发消息,另一端接消息,自己这一段是不能接的
conn1, conn2 = Pipe()
p1 = Process(target=f1,args=(conn2,))
p1.start()
# 管道的发送里面也不用发字节
conn1.send('oh baby')
print('我是爸爸') # 数据接收一次就没有了.也就是说,往管道里面传一次消息,即使有多个进程都来接收,但是只能有一个接收成功
二 . 事件(了解)
import time
from multiprocessing import Process,Event
def f1(e):
time.sleep(2)
n = 100
print('子进程计算结果为',n)
# 将初识对象改为True
e.set()
# 查看现在的状态
print('现在的状态是->',e.is_set())
if __name__ == '__main__':
# 创建事件对象,初识状态是False
e = Event()
p = Process(target=f1,args=(e,))
p.start()
print('主进程等待...')
# e.clear() # clear 是将状态改为False
# 这个对象的状态为False的时候,就在wait的地方等待
e.wait()
print('结果已经写入文件了,可以拿到这值')
三 . 信号量(了解)
import time
import random
from multiprocessing import Process,Semaphore
def f1(i, s):
s.acquire() # 加锁
print('男嘉宾%s号到了' % i)
time.sleep(random.randint(1,3))
s.release() # 解锁 每有一个解开就会有一个进去 if __name__ == '__main__':
s = Semaphore(3) # 计数器 一起能去3个进程
for i in range(10):
p = Process(target=f1,args=(i, s))
p.start()
四. 进程池(重点)
进程的创建和销毁是很浪费时间的,影响代码执行效率. 所以说进程池比多进程同时执行的时候会省很多时间,因为进程池没有创建和销毁这一过程.
import time
from multiprocessing import Process,Pool
def f1(n):
pass
if __name__ == '__main__':
#统计进程池执行100个任务的时间
s_time = time.time()
# 里面这个参数是指定进程池中有多少个进程用的,4表示4个进程,如果不传参数,默认开启的进程数一般是cpu的个数
pool = Pool(4)
pool.map(f1,range(100)) #参数数据必须是可迭代的,异步提交任务,自带close和join功能
e_time = time.time()
dif_time = e_time - s_time
#统计100个进程,来执行100个任务的执行时间
p_s_t = time.time() #多进程起始时间
p_list = []
for i in range(100):
p = Process(target=f1,args=(i,))
p.start()
# 要加入列表里面之后把所有的都加上join
p_list.append(p)
[pp.join() for pp in p_list]
p_e_t = time.time()
p_dif_t = p_e_t - p_s_t
print('进程池的时间:',dif_time)
print('多进程的执行时间:',p_dif_t) # 进程池的时间: 0.17912554740905762
# 多进程的执行时间: 4.200979232788086
同步方法
import time
from multiprocessing import Process,Pool
def f1(n):
time.sleep(1)
return n*n
if __name__ == '__main__':
pool = Pool(4)
for i in range(10):
# 进程池的同步方法,将任务变成了串行
res = pool.apply(f1,args=(i,))
print(res)
异步方法
import time
from multiprocessing import Process,Pool
def f1(n):
time.sleep(2)
return n*n
if __name__ == '__main__':
pool = Pool()
res_list = []
for i in range(5):
#异步给进程池提交任务
res = pool.apply_async(f1,args=(i,))
# print(res) # 得到的是pool对象 <multiprocessing.pool.ApplyResult object at 0x000000AEE8074668>
res_list.append(res)
print('等待所有任务执行完')
# pool.close() #锁住进程池,意思就是不让其他的程序再往这个进程池里面提交任务了,工作中一般不会锁
# pool.join()
#打印结果,如果异步提交之后的结果对象
for i in res_list:
# get()方法就是有就拿,没有就等着
print(i.get()) # 拿到的是返回结果 0,1,4,9,16
五. 回调函数
from multiprocessing import Pool,Process
def f1(n):
print('>>>>',n)
return n*n
def call_back_func(n):
print('回调函数中的结果:',n)
if __name__ == '__main__':
pool = Pool(4)
# callback就是把f1 的返回值当参数传入函数
res = pool.apply_async(f1,args=(5,),callback=call_back_func)
pool.close()
pool.join()
python之路--管道, 事件, 信号量, 进程池的更多相关文章
- Python 并发编程(管道,事件,信号量,进程池)
管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...
- python之管道, 事件, 信号量, 进程池
管道:双向通信 2个进程之间相互通信 from multiprocessing import Process, Pipe def f1(conn): from_zjc_msg = conn.recv( ...
- python并发编程之进程2(管道,事件,信号量,进程池)
管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...
- day 32 管道 事件 信号量 进程池
一.管道(多个时数据不安全) Pipe 类 (像队列一样,数据只能取走一次) conn1,conn2 = Pipe() 建立管道 .send() 发送 .recv() 接收 二.事 ...
- 并发编程7 管道&事件&信号量&进程池(同步和异步方法)
1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...
- python--管道, 事件, 信号量, 进程池
一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...
- python 管道 事件(Event) 信号量 进程池(map/同步/异步)回调函数
####################总结######################## 管道:是进程间通信的第二种方式,但是不推荐使用,因为管道会导致数据不安全的情况出现 事件:当我运行主进程的 ...
- day 32 管道,信号量,进程池,线程的创建
1.管道(了解) Pipe(): 在进程之间建立一条通道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在产生Process对象之前产生管道. ...
- GIL与普通互斥锁区别,死锁现象,信号量,event事件,进程池与线程池,协程
GIL与普通互斥锁区别 GIL锁和互斥锁的异同点 相同: 都是为了解决解释器中多个线程资源竞争的问题 异: 1.互斥锁是Python代码层面的锁,解决Python程序中多线程共享资源的问题(线程数据共 ...
随机推荐
- Idea自带工具解决冲突
1:产生冲突 2:解决冲突 解决冲突具体操作: 手动合并代码: 此时点击的是local的>:点击changes的X则合并效果为: 也可以两侧都点击>.结果为: 也可以都点击X,结果为: 最 ...
- hyperledger中文文档学习-1-词汇表
参考:https://hyperledgercn.github.io/hyperledgerDocs/glossary/ Chaincode - 链码,即智能合约 链码是一个运行在账本上的软件,它可以 ...
- mysql 数据库磁盘占用量统计
查看某个表的磁盘占用量 select (data_length+index_length)/1024/1024 M from information_schema.tables where table ...
- Luogu2860 [USACO06JAN]冗余路径Redundant Paths
Luogu2860 [USACO06JAN]冗余路径Redundant Paths 给定一个连通无向图,求至少加多少条边才能使得原图变为边双连通分量 \(1\leq n\leq5000,\ n-1\l ...
- [TPYBoard - Micropython之会python就能做硬件 6] 学习使用OLED显示屏
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.实验器材 1.TPYBoard板子一块 2.数据线一条 ...
- FAT32文件系统学习(3) —— 数据区(DATA区)
FAT32文件系统学习(3) —— 数据区(DATA区) 今天继续学习FAT32文件系统的数据区部分(Data区).其实这一篇应该是最有意思的,我们可以通过在U盘内放入一些文件,然后在程序中读取出来: ...
- .Net Core 在 Linux-Centos上的部署实战教程(三)
绑定域名,利用Nginx反向代理来操作 1.安装Nginx yun install nginx 安装成功 2.启动nginx service nginx start 报报报错了~~· 运行 ...
- 重装mysql后导致Navicat连接失败
今天重装了mysql数据库,然后再使用navicat去连接数据库的时候,一直报错 1251 Client does not support authentication protocol reques ...
- 617. Merge Two Binary Trees(Easy)
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...
- Tarjan算法(缩点)
因为最近在学2sat,需要学习前置技能—Tarjan算法,所以花了一天的时间学习这个算法 算法步骤: 1.从一个点开始dfs,并加入栈 2.如果下一个点没有到过,跳到第一步 3.如果下一个点到过,并且 ...