使用Python的multiprocessing.Process类

16

这是一个新手问题:

类是一个对象,所以我可以创建一个叫做pippo()的类并在其中添加函数和参数。我不明白pippo内部的函数在我执行 x=pippo() 时是否自上而下执行,或者我必须在pippo外部调用它们,例如x.dosomething()

在使用Python的多进程包时,是更好地定义一个大型函数并在调用Process()时使用target参数创建对象,还是通过继承Process类来创建自己的进程类?


对于你问题的第一部分,如果你想在一个对象被实例化时执行一个函数,那么你可以在类的__init__函数中调用它。你也可以使用property装饰器。我不确定你在第二部分中问的是什么。你能澄清一下吗? - user670595
通常情况下,您会通过对象的引用来调用类方法,例如 x.doSomthing()。您还可以在对象实例化时从类的 __init__ 方法中调用这些方法。如果您希望将对象的方法“作为一个进程”运行,有几种方法可以实现。我个人最喜欢的方法是从 Process 类进行子类化。我在这里解释了一种实现方式:https://dev59.com/yGUo5IYBdhLWcg3wvRpF#16202411 - DMH
1个回答

48

我经常想知道为什么Python的文档页面上只显示“函数式”方法(使用target参数)有关multiprocessing。可能是因为简洁、简洁的代码片段最适合说明用途。对于适合在一个函数中完成的小任务,我可以看出那是首选的方式,如下所示:

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()内部的代码在单独的进程中执行。
因此,如果一个进程(主进程或派生进程)更改其成员变量,则不会在其他进程中反映出这种更改。当然,这仅适用于内置类型,如boolstringlist等。但是,您可以从multiprocessing模块导入“特殊”数据结构,这些数据结构在进程之间透明地共享(请参见进程之间的状态共享)。或者,您可以创建自己的IPC通道(进程间通信),例如multiprocessing.Pipemultiprocessing.Queue

5
在 Windows 上运行多进程需要使用 if __name__ == "__main__" 吗?这只是另一个需要注意的惊喜。 - Wayne Werner
如果生成的进程更改了其类中的某些数据类型,这些更改是否会从主进程中可见? - Woody1193
@Woody1193,不适用于内置数据类型。但是如果您使用multiprocessing模块中的特殊共享数据类型,您将获得所需的效果。(我在上面的答案中添加了这个解释。) - Velimir Mlaker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接