管道

Conn1,conn2 = Pipe()

Conn1.recv()

Conn1.send()

数据接收一次就没有了

  1. from multiprocessing import Process,Pipe
  2.  
  3. def f1(conn):
  4.  
  5. from_zhujincheng = conn.recv()
  6. print('子进程')
  7. print('来自主进程的消息:',from_zhujincheng)
  8.  
  9. if __name__ == '__main__':
  10. conn1,conn2 = Pipe() #创建一个管道对象,全双工,返回管道的两端,但是一端发送的消息,只能另外一端接收,自己这一端是不能接收的
  11. p1 = Process(target=f1,args=(conn2,))
  12. p1.start()
  13.  
  14. conn1.send('出来吧')
  15. print('主进程')

事件

E = Event()  #初识状态是false

E.wait()  当事件对象e的状态为false的时候,在wait的地方会阻塞程序,当对象状态为true的时候,直接在这个wait地方继续往下执行

E.set()  将事件对象的状态改为true,

E.is_set() 查看状态

E.clear()  将事件对象的状态改为false

  1. from multiprocessing import Process,Event
  2.  
  3. e = Event() #创建事件对象,这个对象的初识状态为False
  4. print('e的状态是:',e.is_set()) # False
  5.  
  6. print('进程运行到这里了')
  7. e.set() #将e的状态改为True
  8. print('e的状态是:',e.is_set()) # True
  9.  
  10. e.clear() #将e的状态改为False
  11.  
  12. e.wait() #e这个事件对象如果值为False,就在我加wait的地方等待
  13.  
  14. print('进程过了wait')

信号量

S = semphore(数字),内部维护了一个计数器,acquire-1,release+1,为0的时候,其他的进程都要在acquire之前等待

S.acquire()

需要锁住的代码

S.release()

  1. import time,random
  2. from multiprocessing import Process,Semaphore
  3.  
  4. def f1(i,s):
  5. s.acquire()
  6. print('%s男嘉宾到了'%i)
  7. time.sleep(random.randint(1,3))
  8. s.release()
  9.  
  10. if __name__ == '__main__':
  11. s = Semaphore(4) #计数器4,acquire一次减一,为0 ,其他人等待,release加1
  12. for i in range(10):
  13. p = Process(target=f1,args=(i,s))
  14. p.start()

进程池

进程的创建和销毁是很有消耗的,影响代码执行效率

在有进程池的代码中,主进程运行结束,进程池里面的任务全部停止,不会等待进程池里面的任务

pl = Pool(数字)   这个数字一般是电脑的cpu数

pl的方法:

  Map:异步提交任务,并且传参需要可迭代类型的数据,自带close和join功能

  1. import time
  2. from multiprocessing import Process,Pool
  3.  
  4. #对比多进程和进程池的效率
  5. def f1(n):
  6. for i in range(5):
  7. n = n + i
  8.  
  9. if __name__ == '__main__':
  10.  
  11. #统计进程池执行100个任务的时间
  12. s_time = time.time()
  13. pool = Pool(4)
  14. pool.map(f1,range(100))
  15. e_time = time.time()
  16. dif_time = e_time - s_time
  17.  
  18. #统计100个进程,来执行100个任务的执行时间
  19. p_s_t = time.time() #多进程起始时间
  20. p_list = []
  21. for i in range(100):
  22. p = Process(target=f1,args=(i,))
  23. p.start()
  24. p_list.append(p)
  25. [pp.join() for pp in p_list]
  26. p_e_t = time.time()
  27. p_dif_t = p_e_t - p_s_t
  28. print('进程池的时间:',dif_time)
  29. print('多进程的执行时间:',p_dif_t)
  30. # 结果: 进程池的时间: 0.40102291107177734 多进程的执行时间: 9.247529029846191
  31. # 可以看出进程池运行效率远远大于创建多进程

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

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

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

  1. import time
  2. from multiprocessing import Process,Pool
  3.  
  4. def f1(n):
  5. time.sleep(1)
  6. return n*n
  7.  
  8. if __name__ == '__main__':
  9.  
  10. pool = Pool(4)
  11. for i in range(10):
  12. res = pool.apply(f1,args=(i,))
  13. print(res)

  Res_obj = Apply_async(f1,args=(i,))  #异步提交任务,可以直接拿到结果对象,从结果对象里面拿结果,要用get方法,get方法会阻塞程序,没有拿到结果会一直等待

  1. import time
  2. from multiprocessing import Process,Pool
  3.  
  4. def f1(n):
  5. time.sleep(0.5)
  6. return n*n
  7.  
  8. if __name__ == '__main__':
  9.  
  10. pool = Pool(4)
  11.  
  12. res_list = []
  13. for i in range(10):
  14. res = pool.apply_async(f1,args=(i,)) # 不能直接打印返回值,因为直接返回结果对象,进程还没执行完,结果对象里没有数据
  15. res_list.append(res)
  16.  
  17. pool.close()
  18. pool.join()
  19.  
  20. #打印结果,异步提交之后的结果对象
  21. for i in res_list:
  22. print(i.get())

回调函数:

Apply_async(f1,args=(i,),callback=function)  #将前面f1这个任务的返回结果作为参数传给callback指定的那个function函数

  1. import os
  2. from multiprocessing import Pool,Process
  3.  
  4. def f1(n):
  5. print('传入的函数',n)
  6. return n*n
  7.  
  8. def call_back_func(asdf):
  9. print('回调函数',asdf)
  10.  
  11. if __name__ == '__main__':
  12. pool = Pool(4)
  13. res = pool.apply_async(f1,args=(5,),callback=call_back_func)
  14. pool.close()
  15. pool.join()

python并发编程之进程2(管道,事件,信号量,进程池)的更多相关文章

  1. python并发编程之多进程(三):共享数据&进程池

    一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...

  2. python并发编程之多进程1-----------互斥锁与进程间的通信

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  3. python并发编程之多进程2-------------数据共享及进程池和回调函数

    一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...

  4. python之管道, 事件, 信号量, 进程池

    管道:双向通信 2个进程之间相互通信 from multiprocessing import Process, Pipe def f1(conn): from_zjc_msg = conn.recv( ...

  5. python并发编程之多进程1--(互斥锁与进程间的通信)

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  6. python并发编程之多进程1互斥锁与进程间的通信

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  7. Python 并发编程(管道,事件,信号量,进程池)

    管道 Conn1,conn2 = Pipe() Conn1.recv() Conn1.send() 数据接收一次就没有了 from multiprocessing import Process,Pip ...

  8. 并发编程7 管道&事件&信号量&进程池(同步和异步方法)

    1,管道 2.事件 3.信号量 4.进程池的介绍&&进程池的map方法&&进程池和多进程的对比 5.进程池的同步方法和异步方法 6.重新解释同步方法和异步方法 7.回调 ...

  9. python之路--管道, 事件, 信号量, 进程池

    一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...

随机推荐

  1. 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 ...

  2. 使用表达式目录树实现SqlDataReader到实体的映射

    SqlDataReader映射实体,是ORM的基础功能,常见的实现方式有反射.表达式目录树和emit,这里要说的就是用表达式目录树生成实体的方法. 先分析下思路: 假设有个数据实体类,Student ...

  3. Mysql一个表编码的坑,mark一下

    问题:一个sql执行很慢,5分钟左右,关键是最大的表是5万出头,另一张表不到5000原因:是两个表的字符集不同,导致匹配时,没有匹配到 解决办法:将两个表的字符集改成一样具体的命令: ALTER TA ...

  4. linq动态分页排序

    if (!string.IsNullOrEmpty(order) && !string.IsNullOrEmpty(dir))//判断排序的字段名称和排序的类型是否为空 { if (d ...

  5. ABAP常用事务码

    开发----------------------------------------------- SE51  屏幕制作 SE91  MESSAGE OBJECT SE80  对象浏览器(可以建开发类 ...

  6. Wrinkles should merely indicate where smiles have been.

    Wrinkles should merely indicate where smiles have been. 皱纹应该只是微笑留下的印记.

  7. Bibtex使用介绍

    BibTeX 是一种格式和一个程序, 用于协调LaTeX的参考文献处理. BibTeX 使用数据库的的方式来管理参考文献. BibTeX 文件的后缀名为 .bib . 先来看一个例子 @article ...

  8. Jmeter进行接口的性能测试

    一.录制Jmeter脚本 录制Jmeter脚本有两种方法,一种是设置代理:一种则是利用badboy软件,badboy软件支持导出jmx脚本. 这里我们介绍第二种方法,利用badboy录制脚本,然后导出 ...

  9. myeclipes出现{Could not create the view: An unexpected except

    今天编写代码的时候突然出现了web工程不能部署的情况,后面了解到主要是因为那个myeclipse非正常关闭或者突然断电的情况,我的是属于第一种的,下面整理一下这个解决方法 1.关闭myeclipse ...

  10. 记一次RabbitMq 安装和配置坑

    记一次RabbitMq 安装和配置坑 正常情况下安装 先安装erl ,在安装rabbitmq 这个在windows下的安装没什么技巧,按照默认一路下一步就ok.安装好后可以到cmd测试是否安装好. 测 ...