自学Python 55 多线程开发(五)使用进程库multiprocessing

​Python

活动地址:CSDN21天学习挑战赛


文章目录

  • ​Python
  • 一、使用进程库multiprocessing
  • 二、 threading 和 multiprocessing 的关系
  • 三、使用Pipes和 Queues 对象


一、使用进程库multiprocessing

  在Python语言中,库multiprocessing是一个多进程管理包。和 threading模块类似,multiprocessing提供了生成进程功能的API,提供了包括本地和远程并发,通过使用子进程而不是线程有效地转移全局解释器锁。通过使用 multiprocessing模块,允许程序员充分利用给定机器上的多个处理器。它在 Unix和 Windows上都可以运行。

二、 threading 和 multiprocessing 的关系

  在 Python程序中,multiprocessing是Python语言中的多进程管理包。与 threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程,该进程可以运行在 Python程序内部编写的函数。该Process对象与 Thread对象的用法相同,也有start()、run()和join()等方法。并且在multiprocessing中也有Lock/Event/Semaphore/Conditicon类(这些对象可以像多线程那样,通过参数传递给各个进程),用于同步进程,其用法与threading包中的同名类一致。
  由此可以总结出,multiprocessing 中的很大一部分 API 与threading相同,只不过是换到了多进程的场景中而已。

三、使用Pipes和 Queues 对象

  在Linux系统的多线程机制中,管道 PIPE 和消息队列 message queue 的效率十分优秀。在 Python语言的multiprocessing包中,专门提供了 Pipe和 Queue这两个类来分别支持这两种IPC 机制。通过使用 Pipe和 Queue对象,可以在Python程序中传送常见的对象。
  在Python程序中,Pipe可以是单向(half-duplex),也可以是双向(duplex)。我们通过mutiprocessing.Pipe (duplex=False)创建单向管道(默认为双向)。一个进程从PIPE一端输入对象,然后被 PIPE另一端的进程接收,单向管道只允许管道一端的进程输入,而双向管道则允许从两端输入。
  例如在下面的实例文件中,演示了使用 Pipe对象创建双向管道的过程。

import multiprocessing as mul
def proc1(pipe):
    pipe.send('hello')
    print('proc1 rec:',pipe.recv())
def proc2(pipe):
    print('proc2 rec:',pipe.recv())
    pipe.send('hello, tool')
pipe = mul.Pipe()
p1 = mul.Process(target = proc1, args = (pipe[0],))
p2 = mul.Process(target = proc2, args = (pipe[1],))
p1.start()
p2.start()
p1.join()
p2.join()

  在上述代码中的Pipe是双向的,在Pipe对象建立的时候,返回一个含有两个元素的表,每个元素代表Pipe的一端(Connection对象) 。我们对Pipe的某一端调用send()方法来传送对象,在另一端使用recv()来接收。

你可能感兴趣的:(Python学习,python)