2013-06-18 31 views
12

这是一个新手的问​​题:使用Python的multiprocessing.Process类

类是一个对象,这样我就可以创建一个名为这个附加功能和参数的pippo()和内部类,我不若函数理解当我分配x=pippo()或者我必须在pippo之外呼叫它们作为x.dosomething()时,pippo内部从上到下执行。

与Python的多包工作,是它更好地定义一个大的功能和使用呼叫的target参数创建对象,以Process(),或从Process类继承来创建自己的流程类?

+0

对于您的问题的第一部分,如果您希望在实例化对象时执行某个函数,则可以在类'__init__'函数中对其进行调用。你也可以是[property decorator](http://docs.python.org/2/library/functions.html#property)。我不确定你在第二部分要问什么。你能澄清吗? –

+0

大多数情况下,您将通过对象的引用来调用类方法,例如'x.doSomthing()'。您也可以在对象实例化后立即在内部使用这些方法,方法是从__init__方法调用它们。 如果你想要一个对象的方法“作为一个进程运行”,有几种方法可以做到这一点。我个人最喜欢的是从'Process'子类。我解释一种方法来做到这一点:http://stackoverflow.com/questions/15790816/python-multiprocessing-apply-class-method-to-a-list-of-objects/16202411#16202411 – DMH

回答

23

我经常想知道为什么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.Pipemultiprocessing.Queue

+2

不需要多处理如果您在Windows上运行,如果__name__ ==“__main __”''另一个值得注意的惊喜 –

+0

如果生成的进程在其类中更改了某些数据类型,那么这些更改将在主进程中可见? – Woody1193

+0

@ Woody1193,不适用于内置数据类型。但是,如果您使用'multiprocessing'模块中的特殊共享数据类型,您将获得所需的效果。 (我在上面的答案中添加了这个解释。) –

相关问题