我经常想知道为什么Python的doc页multiprocessing只显示“功能”的方法(使用target
参数)。可能因为简洁,简洁的代码片段最适合用于说明目的。对于符合功能于一体的小任务,我可以看到这是首选的方式,鼻翼:
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()
中的只有代码在不同的进程中执行。
因此,如果一个进程(master或者spawned)改变了它的成员变量,那么这个改变将不会反映到其他进程中。当然,这仅适用于嵌入式类型,例如bool
,string
,list
等。然而,您可以从multiprocessing
模块导入“特殊”数据结构,然后在进程间透明共享(请参阅Sharing state between processes。)或者,您可以创建您自己的IPC(进程间通信)通道,如multiprocessing.Pipe
和multiprocessing.Queue
。
对于您的问题的第一部分,如果您希望在实例化对象时执行某个函数,则可以在类'__init__'函数中对其进行调用。你也可以是[property decorator](http://docs.python.org/2/library/functions.html#property)。我不确定你在第二部分要问什么。你能澄清吗? –
大多数情况下,您将通过对象的引用来调用类方法,例如'x.doSomthing()'。您也可以在对象实例化后立即在内部使用这些方法,方法是从__init__方法调用它们。 如果你想要一个对象的方法“作为一个进程运行”,有几种方法可以做到这一点。我个人最喜欢的是从'Process'子类。我解释一种方法来做到这一点:http://stackoverflow.com/questions/15790816/python-multiprocessing-apply-class-method-to-a-list-of-objects/16202411#16202411 – DMH