8

I'm trying to learn Python multiprocessing.

http://docs.python.org/2/library/multiprocessing.html from the example of "To show the individual process IDs involved, here is an expanded example:"

from multiprocessing import Process
import os

def info(title):
    print title
    print 'module name:', __name__
    if hasattr(os, 'getppid'):  # only available on Unix
        print 'parent process:', os.getppid()
    print 'process id:', os.getpid()

def f(name):
    info('function f')
    print 'hello', name

if __name__ == '__main__':
    info('main line')
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

What exactly am I looking at? I see that def f(name): is called after info('main line') is finished, but this synchronous call would be default anyways. I see that the same process info('main line') is the parent PID of def f(name): but not sure what is 'multiprocessing' about that.

Also, with join() "Block the calling thread until the process whose join() method is called terminates". I'm not clear on what the calling thread would be. In this example what would join() be blocking?

4

1 回答 1

25

简而言之,如何multiprocessing工作:

  • Process()生成(fork或在类 Unix 系统上类似的)原始程序的副本(在 Windows 上,缺少真实的fork,这很棘手,需要模块文档说明的特别注意)。
  • 副本与原件通信以确定(a)它是一个副本,并且(b)它应该启动并调用该target=函数(见下文)。
  • 至此,原件和副本现在不同且独立,可以同时运行。

由于这些是独立的进程,因此它们现在具有独立的全局解释器锁(在 CPython 中),因此只要它们不竞争其他较低级别(OS ) 资源。这就是“多处理”部分。

当然,在某些时候,您必须在这些所谓的独立进程之间来回发送数据,例如,将一个(或多个)工作进程的结果发送回“主”进程。(偶尔会有每个人完全独立的例外情况,但这种情况很少见……另外,还有整个启动序列本身,由 . 开始p.start()。)所以每个创建Process的实例——<code>p,在上面的示例中——都有一个通道到其父创建者,反之亦然(这是一个对称连接)。该multiprocessing模块使用该pickle模块将数据转换为字符串(与您可以存储在文件中的相同字符串)pickle.dump并通过通道“向下”发送数据给工作人员以发送参数等,以及“向上”

最终,一旦你完成了获取结果,worker 完成(通过从target=函数返回)并告诉父级它完成了。为了确保一切都被关闭和清理,父母应该打电话p.join()等待工人的“我完成了”消息(实际上是exitUnix-ish 系统上的操作系统级别)。

这个例子有点傻,因为两条打印的消息基本上根本不需要时间,所以“同时”运行它们没有可衡量的收益。但假设不只是打印hello,而是f计算 π 的前 100,000 位(3.14159...)。然后,您可以生成另一个Processp2具有不同的目标g来计算 e 的前 100,000 位数字(2.71828...)。这些将独立运行。然后父母可以调用p.join()p2.join()等待两者都完成(或者产生更多的工人来做更多的工作并占用更多的CPU,或者甚至先离开并做自己的工作一段时间)。

于 2013-08-11T08:09:04.107 回答