Process.run() 和 Process.start() 的区别

Ama*_*eus 10 python multiprocessing python-multiprocessing

我努力理解之间的差异run()start()。根据文档,run()method 调用传递给对象构造函数的可调用对象,而start()method 启动进程并且只能调用一次。

我尝试了以下示例:

def get_process_id(process_name):
    print process_name, os.getpid()

p1 = multiprocessing.Process(target=get_process_id, args=('process_1',))
p2 = multiprocessing.Process(target=get_process_id, args=('process_2',))

p1.run()
p2.run()
p1.start()
p2.start()
Run Code Online (Sandbox Code Playgroud)

结果如下:

process_1 35138
process_2 35138
process_1 35141
process_2 35142
Run Code Online (Sandbox Code Playgroud)

当我使用时run(),它显示p1p2使用相同的过程。但是当我使用时start(),他们给出了两个不同的。是不是因为调用run()与调用它的进程没有任何关系,而只是调用函数(get_process_id在这个例子中)?

Dar*_*aut 13

您不应该process.run()明确调用。它是调用您指定target函数的方法,除非您在子类化时覆盖它Process。它通常在引导时在新孩子中被调用。除了调用目标函数之外,它什么都不做。

# multiprocessing.process.BaseProcess

def run(self):
    '''
    Method to be run in sub-process; can be overridden in sub-class
    '''
    if self._target:
        self._target(*self._args, **self._kwargs)
Run Code Online (Sandbox Code Playgroud)

当您在父进程中调用它时,它会像任何其他方法一样在您的父进程中执行。

process.start() 是您应该首先在父级中调用以创建新进程的方法。


小智 7

调用start()将创建一个新线程并run()在这个新线程中执行。而调用run()自己将在当前线程本身中执行它。的执行run()不会切换到不同的线程。因此它将在主线程本身上执行其操作。