Python多处理文档示例

达曼

我正在尝试学习Python多处理。

http://docs.python.org/2/library/multiprocessing.html来自“为了显示所涉及的单个进程ID,这是一个扩展的示例”示例

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()

我到底在看什么?我看到def f(name):在info('main line')完成之后被调用,但是无论如何,这个同步调用将是默认的。我看到相同的过程信息(“主线”)是def f(name)的父PID:但是不确定什么是“多处理”。

同样,使用join()“阻塞调用线程,直到调用join()方法的进程终止为止”。我不清楚调用线程是什么。在此示例中,join()将阻塞什么?

周二

multiprocessing简而言之,如何工作:

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

由于它们是独立的进程,因此它们现在具有独立的全局解释器锁(在CPython中),因此只要不与其他较低级别的操作系统(OS)竞争,它们就可以在多CPU盒上最多使用100%的CPU。 ) 资源。那就是“多处理”部分。

当然,在某些时候,您必须在这些假定独立的进程之间来回发送数据,例如,将一个(或多个)工作进程的结果发送回“主”进程。(偶尔会有一个例外,即每个人都是完全独立的,但很少见……加上整个启动过程本身,由开头p.start()。)因此,每个创建的Process实例p(在上面的示例中)都有一个与其父级进行通信的渠道创建者,反之亦然(这是对称连接)。multiprocessing模块使用该pickle模块将数据转换为字符串(您可以使用它们存储在文件中的相同字符串),pickle.dump并通过通道发送数据,“向下”发送给工作人员以发送自变量等,并从“向上”发送给工人以发送回结果。

最终,一旦您完成了获取结果的工作,工作人员就会完成工作(通过从target=函数返回),并告诉父工作已经完成。为确保所有内容均已关闭并清理,父级应调用p.join()以等待工作人员的“我完成了”消息(实际上是exitUnix级别的sysem上的OS级别)。

该示例有点愚蠢,因为两条打印的消息基本上根本不需要时间,因此“同时”运行它们没有可测量的收益。但是,假设不仅要打印hellof还要计算π的前100,000位(3.14159 ...)。然后Process您可以生成另一个p2使用另一个目标g来计算e的前100,000个数字(2.71828 ...)。这些将独立运行。然后,父级可以呼叫p.join()p2.join()等待两者完成(或产生更多的工人来做更多的工作并占用更多的CPU,甚至先离开并自己做一会儿工作)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章