【问题标题】:Python multiprocessing: not using separate memory space?Python多处理:不使用单独的内存空间?
【发布时间】:2019-02-24 04:24:22
【问题描述】:

据我了解,multiprocessing 在 Linux 上使用fork,这意味着multiprocessing 创建的每个进程都有自己的内存空间,并且在其中所做的任何更改都不会影响其他forked 进程。

但是我遇到了这种比较奇怪的情况:

import multiprocessing

i = -1

def change(j):
    global i
    print(i, end=" ")  # should print -1
    i = j 

with multiprocessing.Pool(20) as p:
    p.map(change, range(20))

print(i)  # should print -1

我以为这个程序会准确打印 21 个 -1,因为 multiprocessing 创建了 20 个不共享内存空间的独立子进程,这意味着 i = j 行不会影响任何其他进程中 i 的值;因此在印刷时i = -1

但是,该程序实际上打印了-1 和 0 到 19 之间的随机数字。

例子:

-1 -1 -1 -1 -1 4 -1 5 -1 6 -1 8 -1 -1 14 -1 -1 12 -1 -1 -1

所以我的问题是,为什么我没有得到准确的 21 -1

【问题讨论】:

  • 虽然你使用Pool(20),但它不会真正创建20个进程,直到需要它。这意味着某些任务可能在同一个进程中执行。您可以打印出os.getpid() 进行检查。

标签: python python-3.x multiprocessing


【解决方案1】:

Python 3.2 引入了maxtasksperchild

Maxtasksperchild 是工作进程在退出并被新的工作进程替换之前可以完成的任务数,以释放未使用的资源。默认的 maxtasksperchild 为 None,这意味着工作进程将与池一样长。

import multiprocessing

i = -1

def change(j):
    global i
    print(i, end=" ")  # should print -1
    i = j 

if __name__ == '__main__':
    with multiprocessing.Pool(20, maxtasksperchild=1) as p:
        p.map(change, range(20))
    print(i)  # should print -1

【讨论】:

    【解决方案2】:

    Multiprocessing.Pool 不保证每个任务都会在新进程中运行。实际上,您使用 multiprocessing.Pool 的原因是用于创建新进程的成本被认为很昂贵的任务,因此您希望使用进程池来避免该进程创建开销。 multiprocessing.Pool 的典型使用模式是您创建大量任务,然后创建一个包含少量工作人员的池(通常取决于您的机器拥有的 CPU 内核数量),该池将任务安排给工作人员和尽可能重用流程。如果您想始终启动一个新进程,您应该使用 multiprocessing.Process。

    【讨论】:

      【解决方案3】:

      人们普遍认为它不会,但Pool(20)会立即创建 20 个进程。实际上,这些进程甚至在处理程序线程启动之前就已经启动,这会将任务提供给inqueue,以便稍后由工作人员处理。

      进程运行multiprocessing.pool.worker-code,直到它们从inqueue 到达.get()。只是并非所有人都会在短时间内重新安排从共享队列中获取任务,这一切都需要。队列读取是顺序的,一次只能读取一个进程。有些进程会碰巧获得多个任务,而其他进程则没有安排,因为您的操作系统在内核上运行不同的东西。当您看到除-1 之外的其他值时,一个进程在这里获得了多个任务。

      【讨论】:

        猜你喜欢
        • 2013-01-22
        • 2018-01-20
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        相关资源
        最近更新 更多