【问题标题】:Using Python's multiprocessing.Process class使用 Python 的 multiprocessing.Process 类
【发布时间】:2013-06-18 15:27:43
【问题描述】:

这是一个新手问题:

一个类是一个对象,所以我可以创建一个名为pippo()的类,在这个add函数和参数里面,我不明白pippo里面的函数是不是在我赋值时是从上到下执行的x=pippo() 或者我必须在 pippo 之外将它们称为 x.dosomething()

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

【问题讨论】:

  • 对于问题的第一部分,如果您希望在实例化对象时执行一个函数,那么您可以在类__init__ 函数中调用它。你也可以property decorator。我不确定您在第二部分中要问什么。你能澄清一下吗?
  • 您通常会通过对对象的引用来调用类方法,例如x.doSomthing()。一旦对象被实例化,您也可以在内部使用这些方法,方法是让它们从类__init__ 方法中调用。如果您希望对象的方法“作为进程运行”,有几种方法可以做到。我个人最喜欢从Process 继承。我在这里解释一种方法:stackoverflow.com/questions/15790816/…

标签: python class multiprocessing


【解决方案1】:

我经常想知道为什么multiprocessing 上的 Python 文档页面只显示“功能”方法(使用 target 参数)。可能是因为简洁的代码 sn-ps 最适合用于说明目的。对于适合一个功能的小任务,我可以看到这是首选方式,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

【讨论】:

  • 如果您在 Windows 上运行,多处理是否不需要 if __name__ == "__main__"?只是另一个惊喜
  • 如果衍生进程更改了其类中的某些数据类型,这些更改是否可以从主进程中看到?
  • @Woody1193,不适用于内置数据类型。但是如果你使用来自multiprocessing 模块的特殊共享数据类型,你会得到想要的效果。 (我在上面的答案中添加了这个解释。)
猜你喜欢
  • 2017-12-30
  • 2012-01-19
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 2020-06-05
  • 1970-01-01
相关资源
最近更新 更多