Process.run() 和 Process.start() 之间的区别
Difference between Process.run() and Process.start()
我很难理解 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()
时,显示p1
和p2
使用相同的过程。但是当我使用 start()
时,他们给出了两个不同的。是因为调用 run()
与调用它的进程没有任何关系而只是调用函数(在本例中为 get_process_id
)吗?
你完全正确。如docs中所述,run()
是start()
创建的新线程的入口点。
您不应该显式调用 process.run()
。它是调用您指定的 target
函数的方法,除非您在继承 Process
时覆盖它。它通常在引导时在新 child 中被调用。它除了调用目标函数外什么都不做。
# 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)
当您在 parent 进程中调用它时,它会像任何其他方法一样在您的 parent 进程中执行。
process.start()
是您应该首先在 parent 中调用以创建新进程的方法。
调用start()
将创建一个新线程并在这个新线程中执行run()
。然而,自己调用 run()
将在当前线程本身中执行它。 run()
的执行不会切换到不同的线程。所以它将在主线程本身上执行它的操作。
我很难理解 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()
时,显示p1
和p2
使用相同的过程。但是当我使用 start()
时,他们给出了两个不同的。是因为调用 run()
与调用它的进程没有任何关系而只是调用函数(在本例中为 get_process_id
)吗?
你完全正确。如docs中所述,run()
是start()
创建的新线程的入口点。
您不应该显式调用 process.run()
。它是调用您指定的 target
函数的方法,除非您在继承 Process
时覆盖它。它通常在引导时在新 child 中被调用。它除了调用目标函数外什么都不做。
# 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)
当您在 parent 进程中调用它时,它会像任何其他方法一样在您的 parent 进程中执行。
process.start()
是您应该首先在 parent 中调用以创建新进程的方法。
调用start()
将创建一个新线程并在这个新线程中执行run()
。然而,自己调用 run()
将在当前线程本身中执行它。 run()
的执行不会切换到不同的线程。所以它将在主线程本身上执行它的操作。