首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Process.run()和Process.start()之间的区别

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

Stack Overflow用户
提问于 2019-03-10 12:28:42
回答 3查看 5.4K关注 0票数 11

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

我试过下面的一个例子:

代码语言:javascript
运行
复制
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()

结果如下:

代码语言:javascript
运行
复制
process_1 35138
process_2 35138
process_1 35141
process_2 35142

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-10 13:24:36

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

代码语言:javascript
运行
复制
# 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()是您应该首先在父级中调用以创建新流程的方法。

票数 14
EN

Stack Overflow用户

发布于 2019-03-10 13:54:52

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

票数 7
EN

Stack Overflow用户

发布于 2019-03-10 13:15:06

我觉得你说的很对。正如在docs中所描述的,run()是由start()创建的新线程的入口点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55084433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档