【问题标题】:Difference between Process.run() and Process.start()Process.run() 和 Process.start() 之间的区别
【发布时间】:2019-06-12 20:22:43
【问题描述】:

我很难理解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)?

【问题讨论】:

标签: python multiprocessing python-multiprocessing


【解决方案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】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-22
        • 1970-01-01
        • 2021-12-25
        • 2020-05-10
        • 2014-09-20
        • 2010-10-28
        • 2015-10-04
        • 2012-08-12
        相关资源
        最近更新 更多