使用Python的multiprocessing.Process类

时间:2013-06-18 15:27:44

标签: python class multiprocessing

这是一个新手问题:

一个类是一个对象,所以我可以创建一个名为pippo()的类,在这个add函数和参数中,我不明白pippo里面的函数是否从最高处执行当我分配x=pippo()时,或者我必须在x.dosomething()之外将其称为pippo

使用Python的多处理包,最好是在调用target时使用Process()参数定义一个大函数并创建对象,或者通过继承自{来创建自己的进程类{1}}上课?

1 个答案:

答案 0 :(得分:30)

我经常想知道为什么Python multiprocessing上的文档页面只显示“功能”方法(使用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()内的代码在单独的进程中执行。

因此,如果进程(主进程或衍生进程)更改了其成员变量,则更改将不会反映在其他进程中。当然,这仅适用于内置类型,例如boolstringlist等。但是,您可以从multiprocessing导入“特殊”数据结构然后在进程之间透明地共享模块(参见Sharing state between processes。)或者,您可以创建自己的IPC(进程间通信)通道,例如multiprocessing.Pipemultiprocessing.Queue