从Thread类到Process的Python3

时间:2013-02-21 11:02:57

标签: python-3.x multiprocessing

我有一些独立的线程,如果我可以将它们放入Process中,可能会获得一些速度。

我更改了类x(Thread):使用def运行(self):进入类x(进程)...但是Process似乎没有调用run()。

设置流程的正确语法是什么?

def __init()__:
    Process.__init()__(self, Target=self.run, args=(self,)): ???

1 个答案:

答案 0 :(得分:2)

您可能只是缺少致电instance.start(),其中instance是您之前设置为class x实例的变量。

如果您提供更多(代码)上下文,则更容易回答。从我看到你正在混合两种不同的方式来设置和启动新的线程或进程。这不一定是坏事,也可能是故意的。但如果不是,那么你输入的内容超出了你的需要。

一种方法是:

p = Process(target=f, args=('bob',))
p.start()
p.join()

f是任何功能。第一行设置新的Process实例,第二行分叉,从而启动(子)进程,p.join()等待它完成。这是the documentation

的确切示例

在第二个用例中,您从class Process继承,然后在调用构造函数时通常不指定targetrun是默认方法,当您实际调用process.start()方法时,它将作为分支调用。

class MySubProcess(multiprocessing.Process):
    def __init__(self, *args, **kwargs):
        super().__init__(self)
        # some more specific setup for your class using args/kwargs
    def run(self):
        # here's the code that is going to be run as a forked process
        pass

然后用

运行
p = MySubProcess(any_args_here)
p.start()
p.join()

如果您不需要任何参数,则无需为您的子类定义__init__构造函数。

这两种方法都允许在threading.Thread和multiprocessing.Process数据类型之间切换,只需很少的代码更改。当然,数据共享的工作方式会发生变化,并且线程和进程的通信也会有所不同。