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

问题描述

我很难理解 run()start() 之间的区别.根据文档, run() 方法调用传递给对象构造函数的可调用对象,而 start() 方法启动进程并且只能调用一次.

I am struggling to understand the difference between run() and start(). According to the documentation, run() method invokes the callable object passed to the object's constructor, while start() method starts the process and can be called only once.

我尝试了以下示例:

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)?p>

When I use run(), it shows that p1 and p2 uses the same process. But when I use start(), they give the two difference ones. Is it because calling run() doesn't have anything to do with the process that calls it but just calling the function (which is get_process_id in this example)?


解决方案

你不应该显式调用 process.run().它是调用您指定的 target 函数的方法,除非您在子类化 Process 时重写它.它通常在引导时在新子代中被调用.它除了调用目标函数之外什么都不做.

You are not supposed to call process.run() explicitly. It's the method which invokes your specified target function unless you override it when you subclass Process. It normally gets called within the new child while it bootstraps. It does nothing else than calling the target function.

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

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

When you call it in your parent process, it gets executed in your parent process like any other method.

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

process.start() is the method which you're supposed to call in your parent to create the new process in the first place.

相关文章