python多进程之pipe(管道),queue,pool

上面写了Python如何创建多个进程,但是前面文章中创建的进程都是哑巴和聋子,自己顾自己执行,不会相互交流。
那么如何让进程间相互说说话呢?
Python为我们提供了一个函数multiprocessing.Pipe
和一个类:multiprocessing.Queue

6. Pipe

 

Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1conn2均可收发。

duplexFalseconn1只负责接受消息,conn2只负责发送消息。

 

 sendrecv方法分别是发送和接受消息的方法。例如,在全双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息。如果没有消息可接收,recv方法会一直阻塞。如果管道已经被关闭,那么recv方法会抛出EOFError

 

 

 

Pipe仅仅适用于只有两个进程一读一写的单双工情况,也就是说信息是只向一个方向流动。例如电视、广播,看电视的人只能看,电视台是能播送电视节目。

 

Pipe的读写效率要高于Queue

 pipe[0] 固定管道发送消息的端口  

pipe[1] 固定管道接收消息的端口

 

 

多进程+queue

 

 

结果为1

Pool 进程池

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。

当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。
Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。

  • apply_async(func[, args[, kwds[, callback]]]) 它是非阻塞apply(func[, args[, kwds]])阻塞的(理解区别,看例12结果区别)
  • close()    关闭pool,使其不在接受新的任务。
  • terminate()    结束工作进程,不在处理未完成的任务。
  • join()    主进程阻塞,等待子进程的退出, join方法要在closeterminate之后使用。

 

执行说明:创建一个进程池pool,并设定进程的数量为3xrange(4)会相继产生四个对象[0, 1, 2, 4],四个对象被提交到pool中,因pool指定进程数为3,所以012会直接送到进程中执行,当其中一个执行完事后才空出一个进程处理对象3,所以会出现输出“msg: hello 3”出现在"end"后。因为为非阻塞,主函数会自己执行自个的,不搭理进程的执行,所以运行完for循环后直接输出“tyh”,主程序在pool.join()处等待各个进程的结束。

 

 

posted @ 2020-11-26 09:30  7dao  阅读(3443)  评论(0编辑  收藏  举报