python并发编程之进程2(管道,事件,信号量,进程池)
管道
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并发编程之进程2(管道,事件,信号量,进程池)的更多相关文章
- python并发编程之多进程(三):共享数据&进程池
一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...
- python并发编程之多进程1-----------互斥锁与进程间的通信
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
- python并发编程之多进程2-------------数据共享及进程池和回调函数
一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...
- python之管道, 事件, 信号量, 进程池
管道:双向通信 2个进程之间相互通信 from multiprocessing import Process, Pipe def f1(conn): from_zjc_msg = conn.recv( ...
- python并发编程之多进程1--(互斥锁与进程间的通信)
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
- python并发编程之多进程1互斥锁与进程间的通信
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
- Python 并发编程(管道,事件,信号量,进程池)
管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...
- 并发编程7 管道&事件&信号量&进程池(同步和异步方法)
1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...
- python之路--管道, 事件, 信号量, 进程池
一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...
随机推荐
- Mac客户端CentOS服务器 SSH免密码登陆
假定有2个服务器A(127.0.0.1)和B(192.168.0.1),A作为客户端来登录服务器B 1.在服务器A下使用 ssh-keygen -t ras -P 会在-/.ssh目录下'生成公钥(i ...
- 使用表达式目录树实现SqlDataReader到实体的映射
SqlDataReader映射实体,是ORM的基础功能,常见的实现方式有反射.表达式目录树和emit,这里要说的就是用表达式目录树生成实体的方法. 先分析下思路: 假设有个数据实体类,Student ...
- Mysql一个表编码的坑,mark一下
问题:一个sql执行很慢,5分钟左右,关键是最大的表是5万出头,另一张表不到5000原因:是两个表的字符集不同,导致匹配时,没有匹配到 解决办法:将两个表的字符集改成一样具体的命令: ALTER TA ...
- linq动态分页排序
if (!string.IsNullOrEmpty(order) && !string.IsNullOrEmpty(dir))//判断排序的字段名称和排序的类型是否为空 { if (d ...
- ABAP常用事务码
开发----------------------------------------------- SE51 屏幕制作 SE91 MESSAGE OBJECT SE80 对象浏览器(可以建开发类 ...
- Wrinkles should merely indicate where smiles have been.
Wrinkles should merely indicate where smiles have been. 皱纹应该只是微笑留下的印记.
- Bibtex使用介绍
BibTeX 是一种格式和一个程序, 用于协调LaTeX的参考文献处理. BibTeX 使用数据库的的方式来管理参考文献. BibTeX 文件的后缀名为 .bib . 先来看一个例子 @article ...
- Jmeter进行接口的性能测试
一.录制Jmeter脚本 录制Jmeter脚本有两种方法,一种是设置代理:一种则是利用badboy软件,badboy软件支持导出jmx脚本. 这里我们介绍第二种方法,利用badboy录制脚本,然后导出 ...
- myeclipes出现{Could not create the view: An unexpected except
今天编写代码的时候突然出现了web工程不能部署的情况,后面了解到主要是因为那个myeclipse非正常关闭或者突然断电的情况,我的是属于第一种的,下面整理一下这个解决方法 1.关闭myeclipse ...
- 记一次RabbitMq 安装和配置坑
记一次RabbitMq 安装和配置坑 正常情况下安装 先安装erl ,在安装rabbitmq 这个在windows下的安装没什么技巧,按照默认一路下一步就ok.安装好后可以到cmd测试是否安装好. 测 ...