当前位置: 首页 > 面试题库 >

Python多重处理模块的.join()方法到底在做什么?

呼延晋
2023-03-14
问题内容

从PMOTW文章中了解Python多重处理,并且希望对方法的确切作用进行一些说明。join()

在2008年的旧教程中,它指出,没有p.join()以下代码中的调用,“子进程将处于空闲状态而不会终止,成为必须手动杀死的僵尸”。

from multiprocessing import Process

def say_hello(name='world'):
    print "Hello, %s" % name

p = Process(target=say_hello)
p.start()
p.join()

我添加的打印输出PID,以及一个time.sleep测试,并就我所知道的,在自己的进程终止:

from multiprocessing import Process
import sys
import time

def say_hello(name='world'):
    print "Hello, %s" % name
    print 'Starting:', p.name, p.pid
    sys.stdout.flush()
    print 'Exiting :', p.name, p.pid
    sys.stdout.flush()
    time.sleep(20)

p = Process(target=say_hello)
p.start()
# no p.join()

20秒内:

936 ttys000    0:00.05 /Library/Frameworks/Python.framework/Versions/2.7/Reso
938 ttys000    0:00.00 /Library/Frameworks/Python.framework/Versions/2.7/Reso
947 ttys001    0:00.13 -bash

20秒后:

947 ttys001    0:00.13 -bash

行为与p.join()添加回文件末尾的行为相同。每周Python模块提供了非常易读的模块解释;
“要等到进程完成工作并退出后,请使用join()方法。”,但看来至少OS X仍在这样做。

我也想知道该方法的名称。该.join()方法在此处串联吗?它是在连接过程的结尾吗?还是只是与Python的本地.join()方法共享一个名称?


问题答案:

join()threading或一起使用时,该方法multiprocessing与之无关str.join()-实际上没有将任何东西串联在一起。相反,它仅表示“等待此[线程/进程]完成”。join之所以使用该名称,是因为该multiprocessing模块的API看起来类似于该threading模块的API,并且该threading模块join用于其Thread对象。join在许多html" target="_blank">编程语言中,使用该术语表示“等待线程完成”是很常见的,因此Python也采用了它。

现在,您看到有和没有调用都延迟20秒的原因join()是因为默认情况下,当主进程准备退出时,它将隐式调用join()所有正在运行的multiprocessing.Process实例。在multiprocessing文档中并未对此进行明确说明,但在“编程指南”部分中进行了提及:

还请记住,非守护进程将自动加入。

您可以通过设置覆盖此行为daemon上的标志ProcessTrue之前,要启动的过程:

p = Process(target=say_hello)
p.daemon = True
p.start()
# Both parent and child will exit here, since the main process has completed.

如果这样做,则子进程将在主进程完成后立即终止:

守护程序

进程的守护程序标志,一个布尔值。必须在调用start()之前进行设置。

初始值是从创建过程继承的。

进程退出时,它将尝试终止其所有守护程序子进程。



 类似资料:
  • 问题内容: 我对Python来说还很陌生,并且完全不理解所读内容是连接字符串的首选方法。 我试过了: 并得到类似: 为什么会这样工作?难道不595应该自动追加吗? 问题答案: 仔细查看你的输出: 我突出显示了原始字符串的“ 5”,“ 9”,“ 5”。Python的join()方法是一个字符串的方法,而且占据了名单的事情,加入以字符串。一个简单的示例可能有助于解释: 在给定列表的每个元素之间插入“,

  • 问题内容: 我在Python文档的FileObjects中找到了这个: flush()不一定会将文件的数据写入磁盘。使用flush()和os.fsync()来确保此行为。 所以我的问题是:Python到底在做什么?我以为这会强制将数据写入磁盘,但现在我知道并没有。为什么? 问题答案: 通常涉及两个级别的缓冲: 内部缓冲器 操作系统缓冲区 内部缓冲区是由您要针对其进行编程的运行时/库/语言创建的缓冲

  • 为了给出基本的思想,下面是所涉及的代码的样子: 方法处理按钮操作,位于根布局控制器中: 它填充一个可观察的列表,该列表随后传递给第二个page控制器,以便在表视图中显示它们。显示此视图并设置每件事的方法如下:

  • 问题内容: 最初,我有一个类来存储一些处理后的值,并将其与其他方法重用。 问题是,当我尝试将类方法划分为多个进程以加快速度时,python生成了进程,但它似乎不起作用(正如我在“任务管理器”中看到的那样,只有1个进程在运行)并且结果从未交付。 我进行了几次搜索,发现pathos.multiprocessing可以代替它,但是我想知道标准库是否可以解决这个问题? 问题答案: 您的代码失败了,因为它无

  • 我对上面的代码感到困惑,其中片段有一个叫做的东西。 我不太清楚setArguments(args)到底是做什么的,我也想知道getArguments()方法是做什么的,因为我在查看开发人员时看到了它。Android通用域名格式。

  • 我正在学习python,我想创建一些代码,这些代码将获取列表列表,检查每一行对于给定的索引号是否有特定的值,如果有,则删除整行。现在我直觉地决定使用删除行,但是当我打印出带有删除值的列表时,我得到了相同的列表。我添加了一个计数器来检查是否有任何行具有要删除的值,并且它们确实存在。以下代码说明了我遇到的问题: 输出 如果不删除此处的元素,del的功能是什么?