python多处理的run()和start()之间的区别

时间:2019-03-10 04:28:42

标签: python python-multiprocessing

我正在努力了解run()start()之间的区别。根据文档,run()方法将调用传递给对象构造函数的可调用对象,而start()方法将启动该过程,并且只能被调用一次。

我尝试了以下示例:

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()

结果如下:

process_1 35138
process_2 35138
process_1 35141
process_2 35142

当我使用run()时,它表明p1p2使用相同的过程。但是当我使用start()时,它们会给出两个不同的值。是因为调用run()与调用它的过程无关,而只是调用函数(在此示例中为get_process_id)吗?

3 个答案:

答案 0 :(得分:1)

您完全正确。如docs中所述,run()start()创建的新线程的入口点。

答案 1 :(得分:1)

您不应明确地致电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)

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

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

答案 2 :(得分:1)

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