我有一些独立的线程,如果我可以将它们放入 Process 中,它们可能会获得一些速度。
我将类 x(Thread): 与 def run(self): 更改为类 x(Process)... 但进程似乎没有调用 run()。
设置流程的正确语法是什么?
def __init()__:
Process.__init()__(self, Target=self.run, args=(self,)): ???
我有一些独立的线程,如果我可以将它们放入 Process 中,它们可能会获得一些速度。
我将类 x(Thread): 与 def run(self): 更改为类 x(Process)... 但进程似乎没有调用 run()。
设置流程的正确语法是什么?
def __init()__:
Process.__init()__(self, Target=self.run, args=(self,)): ???
您可能只是缺少调用instance.start()
whereinstance
是您之前设置为class x
.
如果您提供更多(代码)上下文,则更容易回答。据我所知,您正在混合两种不同的方式来设置和启动新线程或进程。这不一定是坏事,可能是故意的。但如果不是,那么您输入的内容超出了您的需要。
一种方法是:
p = Process(target=f, args=('bob',))
p.start()
p.join()
具有f
任何功能。第一行设置一个新Process
实例,第二行分叉并因此启动(子)进程,并p.join()
等待它完成。这是文档的确切示例
在第二个用例中,您从 子类化class Process
,然后target
在调用构造函数时通常不指定 a 。run
是实际调用方法时作为分叉调用的默认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 数据类型之间切换,只需很少的代码更改。当然,数据共享的工作方式发生了变化,线程和进程的通信也不同。