【问题标题】:Modify global variable with Pool in multiprocessing module在多处理模块中使用 Pool 修改全局变量
【发布时间】:2019-07-11 13:18:19
【问题描述】:

我不熟悉多处理模块。我正在尝试验证不同过程中的变量是否无关紧要。经过测试,我发现不同的进程可能“共享”变量。当进程具有相同的 pid 时会发生这种情况。不知道有没有关系?

环境:Windows 10;蟒蛇3.7

# -*- coding: utf-8 -*-

import os
from multiprocessing import Pool

p=0

def Child_process(id_number):
    global p
    print('Task start: %s(%s)' % (id_number, os.getpid()))
    print('p = %d' % p)
    p=p+1
    print('Task {} end'.format(id_number))


if __name__ == '__main__':
    p = Pool(4)
    p.map(Child_process,range(5))
    p.close()
    p.join()

结果是: 任务开始:0(7668)
p = 0
任务开始:1(10384)
任务 0 结束
p = 0
任务开始:2(7668)
p = 1
任务 1 结束
任务 2 结束
任务开始:3(7668)
任务开始:4(10384)
p = 1
任务 4 结束
p = 2
任务 3 结束

我认为p应该总是0,但是当不同进程具有相同的pid时它会增加?

【问题讨论】:

  • @Green Cloak Guy 我明白了。谢谢
  • @GreenCloakGuy:这不是 PID 重用。这是一个由四个长寿命进程组成的池,其中一个进程执行多个任务;它不是为每个任务创建一个新进程。

标签: python python-3.x python-multiprocessing


【解决方案1】:

根据定义,线程/进程池将重复使用相同的线程/进程。这使您可以在线程/进程启动时设置资源,以便每个线程/进程不必每次都初始化它们。这包括全局变量、打开的文件、套接字等。您可以通过将initializer 函数传递给线程/进程来进行一次性初始化。因此,如果您设置或增加变量p,它将在整个过程的各种运行中保持设置。如果您希望变量在每次运行时始终从 0 开始,则需要在每次运行开始时将其设置为 0。

此注释属于multiprocessing.pool.Pool 类:

注意:池中的工作进程通常在池的工作队列的整个持续时间内都存在。在其他系统(如 Apache、mod_wsgi 等)中发现的一种常见模式是释放工作人员持有的资源,即允许池中的工作人员在退出、清理和产生新进程之前只完成一定数量的工作替换旧的。池的 maxtasksperchild 参数向最终用户公开了这种能力。

【讨论】:

  • 对不起,我还是不太清楚。 1.那么如果我不指定maxtasksperchild参数,该进程会重新使用之前设置的同一进程的资源吗? 2.“根据定义,一个线程/进程池会重复使用同一个线程/进程。”同一个进程的定义是什么? 3. 为什么我的示例中的每个进程不使用与全局变量 p 相同的资源?但是有 3 个进程使用相同的变量 p,另外 2 个使用另一个相同的变量 p。非常感谢!
  • 看起来实际上只有 2 个进程。所以这就解释了。我还建议在 p @huangjl 的打印中打印 pid。
  • @Tomerikoo 我已经明白一个进程可以重用另一个进程的资源。但我不确定该进程何时会重新使用另一个进程,我猜当它们运行相同的功能时会发生这种情况?为什么只有两个进程,而不是三个、四个……这是随机的吗?谢谢!
  • 您的代码使用 4 个进程 (Pool(4)) 初始化池。没有真正定义使用 4 个过程中的哪一个。由于您运行的函数相当短,第一个进程可能很快完成,因此被重用而不是第三个进程。
  • 要了解线程/进程池,您可能希望查看这篇 Wikipeia 文章:en.wikipedia.org/wiki/Thread_pool。一个进程不能重用另一个进程的资源,但一个进程可以多次运行相同的功能。在您的情况下,PID=7668 的进程运行函数 Child_process 3 次,而 PID=10384 的进程运行函数 Child_process 两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多