管道

Conn1,conn2 = Pipe()

Conn1.recv()

Conn1.send()

数据接收一次就没有了

from multiprocessing import Process,Pipedef 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,Evente = Event()  #创建事件对象,这个对象的初识状态为False
print('e的状态是:',e.is_set())  #  Falseprint('进程运行到这里了')
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,Semaphoredef 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加1for 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 + iif __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_tprint('进程池的时间:',dif_time)print('多进程的执行时间:',p_dif_t)# 结果:  进程池的时间: 0.40102291107177734    多进程的执行时间: 9.247529029846191     # 可以看出进程池运行效率远远大于创建多进程

  

Close : 锁住进程池,防止有其他的新的任务在提交给进程池

  Join : 等待着进程池将自己里面的任务都执行完

  Res = Apply(f1,args=(i,))  #同步执行任务,必须等任务执行结束才能给进程池提交下一个任务,可以直接拿到返回结果res

import time
from multiprocessing import Process,Pooldef f1(n):time.sleep(1)return n*nif __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,Pooldef f1(n):time.sleep(0.5)return n*nif __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,Processdef f1(n):print('传入的函数',n)return n*ndef 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()

转载于:https://www.cnblogs.com/a2534786642/p/10267312.html

05 Python 并发编程(管道,事件,信号量,进程池)相关推荐

  1. 并发 --- 32 管道 事件 信号量 进程池

    一.管道(多个时数据不安全)   Pipe 类 (像队列一样,数据只能取走一次) conn1,conn2 = Pipe()     建立管道 .send()   发送 .recv()   接收 二.事 ...

  2. Python并发编程:多进程-守护进程

    一 守护进程 主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比皇帝身边的老太监,皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束后就终止 ...

  3. python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...

    9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...

  4. python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...

    前言:本博文是对Python并发编程之进程的知识延伸,主要讲解:守护进程.锁.信号量. 友情链接: 一.守护进程(daemon) 1.1 守护进程概念 首先我们都知道:正常情况下,主进程默认等待子进程 ...

  5. python并发编程之semaphore(信号量)_Python 并发编程系列之多线程

    Python 并发编程系列之多线程 2 创建线程 2.1 函数的方式创建线程 2.2 类的方式创建线程 3 Thread 类的常用属性和方法 3.1 守护线程: Deamon 3.2 join()方法 ...

  6. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  7. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...

  8. Python并发编程之线程池/进程池

    引言 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...

  9. Python并发编程之进程池

    Python并发编程之进程池 一.进程池简介 二.进程池代码实例 一.进程池简介 可以用Pool类来创建进程池,可以把各种数据处理任务都提交给进程池.进程池提供的功能有点类似于列表解析和功能性编程操作 ...

最新文章

  1. c global 拦截 ajax,@RestControllerAdvice 全局拦截异常(示例代码)
  2. 服务器一拷贝文件就死机,u盘拷贝文件时导致电脑死机怎么办【解决方法】
  3. AppLaunchScreen/Screenshot(启动图/屏幕快照)输出规范
  4. 3、excel数据格式设置快捷键
  5. tornado框架的get方法传递参数
  6. 软件oem要注意什么_做化妆品oem,选择化妆品包材要注意什么问题
  7. 学计算机和摄影哪个好,【干货】如何学习好摄影后期
  8. 蓝绿部署、滚动发布、灰度发布等方案对比总结
  9. 5. soapui 测试
  10. 【MQTT编程】Last will and Testament(LWT Payload设置)
  11. Epub 转 txt
  12. 一位优秀的学弟,计算机2019保研经历分享(北大信科、清华计算机系)
  13. FLASH抽象层(FAL)程序的应用(rt-thread)
  14. 小程序map的自定义图标不显示问题
  15. 练习STM32动态更改PWM波频率和占空比
  16. hadoop集群搭建及易踩坑收录
  17. [XDOJ]矩阵相乘
  18. Node.js 的安装(电脑win7支持的版本)
  19. 羽素登陆《岭南大医生》专业顾问带你避雷护肤误区
  20. 量化投资之宏观篇 | 达里欧谈美国社会的矛盾及如何改良

热门文章

  1. UIT-SV3600i-D/Storage Manger RAID5以及IP-SAN(iscsi)配置
  2. userAgent,JS用户代理检测——判断浏览器内核、浏览器、浏览器平台、windows操作系统版本、移动设备、游戏系统
  3. 使用Spring框架的好处(转帖)
  4. android开发调用照相机
  5. HDU2085:核反应堆(递推)
  6. 为什么socket接收大数据的时候接收不完全,出现丢包?
  7. iview default-file-list 动态赋值不显示
  8. 团队作业——随堂小测(同学录)
  9. 华为为什么能成全球第一?告诉你三个真相!
  10. 不仅仅是商务旗舰,金立M2017的拍照实力同样给力