Python 并发编程(管道,事件,信号量,进程池)
管道
Conn1,conn2 = Pipe()
Conn1.recv()
Conn1.send()
数据接收一次就没有了
from multiprocessing import Process,Pipe
def f1(conn):
from_zhujincheng = conn.recv()
print('子进程')
print('来自主进程的消息:',from_zhujincheng)
if __name__ == '__main__':
conn1,conn2 = Pipe() #创建一个管道对象,全双工,返回管道的两端,但是一端发送的消息,只能另外一端接收,自己这一端是不能接收的
p1 = Process(target=f1,args=(conn2,))
p1.start()
conn1.send('出来吧')
print('主进程')
事件
E = Event() #初识状态是false
E.wait() 当事件对象e的状态为false的时候,在wait的地方会阻塞程序,当对象状态为true的时候,直接在这个wait地方继续往下执行
E.set() 将事件对象的状态改为true,
E.is_set() 查看状态
E.clear() 将事件对象的状态改为false
from multiprocessing import Process,Event e = Event() #创建事件对象,这个对象的初识状态为False
print('e的状态是:',e.is_set()) # False print('进程运行到这里了')
e.set() #将e的状态改为True
print('e的状态是:',e.is_set()) # True e.clear() #将e的状态改为False e.wait() #e这个事件对象如果值为False,就在我加wait的地方等待 print('进程过了wait')
信号量
S = semphore(数字),内部维护了一个计数器,acquire-1,release+1,为0的时候,其他的进程都要在acquire之前等待
S.acquire()
需要锁住的代码
S.release()
import time,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(4) #计数器4,acquire一次减一,为0 ,其他人等待,release加1
for i in range(10):
p = Process(target=f1,args=(i,s))
p.start()
进程池
进程的创建和销毁是很有消耗的,影响代码执行效率
在有进程池的代码中,主进程运行结束,进程池里面的任务全部停止,不会等待进程池里面的任务
pl = Pool(数字) 这个数字一般是电脑的cpu数
pl的方法:
Map:异步提交任务,并且传参需要可迭代类型的数据,自带close和join功能
import time
from multiprocessing import Process,Pool #对比多进程和进程池的效率
def f1(n):
for i in range(5):
n = n + i if __name__ == '__main__': #统计进程池执行100个任务的时间
s_time = time.time()
pool = Pool(4)
pool.map(f1,range(100))
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()
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.40102291107177734 多进程的执行时间: 9.247529029846191
# 可以看出进程池运行效率远远大于创建多进程
Close : 锁住进程池,防止有其他的新的任务在提交给进程池
Join : 等待着进程池将自己里面的任务都执行完
Res = Apply(f1,args=(i,)) #同步执行任务,必须等任务执行结束才能给进程池提交下一个任务,可以直接拿到返回结果res
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)
Res_obj = Apply_async(f1,args=(i,)) #异步提交任务,可以直接拿到结果对象,从结果对象里面拿结果,要用get方法,get方法会阻塞程序,没有拿到结果会一直等待
import time
from multiprocessing import Process,Pool def f1(n):
time.sleep(0.5)
return n*n if __name__ == '__main__': pool = Pool(4) res_list = []
for i in range(10):
res = pool.apply_async(f1,args=(i,)) # 不能直接打印返回值,因为直接返回结果对象,进程还没执行完,结果对象里没有数据
res_list.append(res) pool.close()
pool.join() #打印结果,异步提交之后的结果对象
for i in res_list:
print(i.get())
回调函数:
Apply_async(f1,args=(i,),callback=function) #将前面f1这个任务的返回结果作为参数传给callback指定的那个function函数
import os
from multiprocessing import Pool,Process def f1(n):
print('传入的函数',n)
return n*n def call_back_func(asdf):
print('回调函数',asdf) if __name__ == '__main__':
pool = Pool(4)
res = pool.apply_async(f1,args=(5,),callback=call_back_func)
pool.close()
pool.join()
Python 并发编程(管道,事件,信号量,进程池)的更多相关文章
- python之路--管道, 事件, 信号量, 进程池
一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...
- python并发编程之进程2(管道,事件,信号量,进程池)
管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...
- 并发编程7 管道&事件&信号量&进程池(同步和异步方法)
1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...
- python之管道, 事件, 信号量, 进程池
管道:双向通信 2个进程之间相互通信 from multiprocessing import Process, Pipe def f1(conn): from_zjc_msg = conn.recv( ...
- day 32 管道 事件 信号量 进程池
一.管道(多个时数据不安全) Pipe 类 (像队列一样,数据只能取走一次) conn1,conn2 = Pipe() 建立管道 .send() 发送 .recv() 接收 二.事 ...
- Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信
Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...
- python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程
python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...
- python并发编程基础之守护进程、队列、锁
并发编程2 1.守护进程 什么是守护进程? 表示进程A守护进程B,当被守护进程B结束后,进程A也就结束. from multiprocessing import Process import time ...
- python--管道, 事件, 信号量, 进程池
一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...
随机推荐
- eslint 配置及规则说明
中文官方网站 安装 可以全局安装,也可以在项目下面安装. 如下是在项目中安装示例,只需要在 package.json 中添加如下配置,并进行安装: “eslint”: “^4.11.0” 配置 配置方 ...
- docker部署consol 集群
拉取镜像 docker pull consul 启动节点1 docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt&q ...
- Python文件与函数练习题
练习题 文件处理相关 编码问题 请说明python2 与python3中的默认编码是什么? python2默认是ASCII码,python3默认是utf-8 为什么会出现中文乱码?你能列举出现乱码的情 ...
- 【sping揭秘】7、国际化信息支持
Spring提供messagesource接口,来进行国际化事务处理 Applicationcontext会优先找一个名为messageSouce的messageSource接口实现bean,如果找不 ...
- 13-01 java StringBuffer类,StringBuilder类
StringBuffer类的构造方法 package cn.itcast_01; /* * 线程安全(多线程讲解) * 安全 -- 同步 -- 数据是安全的 * 不安全 -- 不同步 -- 效率高一些 ...
- odoo开发笔记--python获取当天时间
取得时间相关的信息的话,要用到python time模块,python time模块里面有很多非常好用的功能,你可以去官方文档了解下,要取的当前时间的话,要取得当前时间的时间戳,时间戳好像是1970年 ...
- 多线程的实现及常用方法_DAY23
1:多线程(理解) (1)如果一个应用程序有多条执行路径,则被称为多线程程序. 进程:正在执行的程序. 线程:程序的执行路径,执行单元. 单线程:如果一个应用程序只有一条执行路径,则被称为单线程程序. ...
- Java实现二分法排序
二分法:(二分法不是只能做数组,这里的数组只是为了举例) 在给出的有序排列的数组中,把目标值和数组中间值进行比较,如果相等,则返回中间值下标,如果目标值小于中间值,就从数组的前半段再次执行二分法查找, ...
- (转)kafka实战教学
转载自:https://www.cnblogs.com/hei12138/p/7805475.html Apache kafka 工作原理介绍-----https://www.ibm.com/deve ...
- (转)Linux top命令的用法详细详解
原文:https://yq.aliyun.com/articles/399004?spm=a2c4e.11153940.blogcont399002.9.3a19f00aHOA3SH# 摘要: 首先介 ...