我经常想知道为什么Python的有关多处理的doc页面仅显示“功能性”方法(使用target
参数)。可能是因为简洁的代码段最适合用于说明目的。对于适合一个功能的小任务,我可以看到这是首选的方式,ala:
from multiprocessing import Process
def f():
print('hello')
p = Process(target=f)
p.start()
p.join()
但是,当您需要更大的代码组织(用于复杂的任务)时,创建自己的类是可行的方法:
from multiprocessing import Process
class P(Process):
def __init__(self):
super(P, self).__init__()
def run(self):
print('hello')
p = P()
p.start()
p.join()
请记住,每个生成的进程都使用主进程的内存占用量副本进行初始化。而且构造函数代码(即内部的东西__init__()
)是在主进程中执行的- 只有内部的代码run()
在单独的进程中执行。
因此,如果某个进程(主进程或生成的进程)更改了其成员变量,则该更改将不会反映在其他进程中。这,当然,是唯一真正的储存卡,在类型,如bool
,string
,list
,等。但是,您可以导入“特殊”的数据结构,从multiprocessing
其中将被透明的过程(见之间共享模块进程间共享状态。)或者,您可以创建自己的IPC(进程间通信)渠道,例如multiprocessing.Pipe
和multiprocessing.Queue
。