dma*_*man 8 python multithreading multiprocessing
我正在尝试学习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()
Run Code Online (Sandbox Code Playgroud)
我究竟在看什么?我看到def f(name):在info('main line')完成后被调用,但是这个同步调用仍然是默认的.我看到相同的进程信息('主线')是def f(name)的父PID:但不确定那是什么'多处理'.
另外,使用join()"阻塞调用线程,直到调用join()方法的进程终止".我不清楚调用线程是什么.在这个例子中,join()会阻塞什么?
tor*_*rek 25
multiprocessing
简而言之,如何运作:
Process()
spawns(fork
或类Unix系统上的类似)原始程序的副本(在Windows上,缺少真实fork
,这很棘手,需要特别注意模块文档说明).target=
功能(见下文).由于这些是独立的进程,它们现在具有独立的全局解释器锁(在CPython中),因此两者都可以在多CPU盒上使用高达100%的CPU,只要它们不竞争其他较低级别(OS) )资源.这就是"多处理"部分.
当然,在某些时候,您必须在这些假设独立的进程之间来回发送数据,例如,将一个(或多个)工作进程的结果发送回"主"进程.(偶尔有一个例外,每个人都完全独立,但很少见......加上整个启动序列本身,由此开始p.start()
.)所以每个创建的Process
实例p
- 在上面的示例中 - 都有一个与其父级的通信通道创建者,反之亦然(这是对称连接).该multiprocessing
模块使用pickle
模块将数据转换为字符串 - 您可以存储在文件中的相同字符串pickle.dump
- 并通过通道发送数据,"向下"发送给工作人员以发送参数等,并从工作人员"向上"发送回结果.
最后,一旦你完成了获得结果,工人就完成了(通过从target=
函数返回)并告诉父母它已经完成了.为了确保所有内容都被关闭和清理,父进程应调用p.join()
等待工作者的"我已完成"消息(实际上是exit
Unix-ish sysems上的操作系统级别).
这个例子有点傻,因为两条打印的消息基本上没有时间,所以"同时"运行它们没有可测量的收益.但是假设不是仅仅打印hello
,而是f
计算π的前100,000个数字(3.14159 ......).然后你可以产生另一个Process
,p2
使用不同的目标g
来计算e的前100,000个数字(2.71828 ...).这些将独立运行.然后,父母可以调用p.join()
并p2.join()
等待两者完成(或者产生更多的工作人员以完成更多的工作并占用更多的CPU,甚至可以先完成自己的工作一段时间).
归档时间: |
|
查看次数: |
8646 次 |
最近记录: |