multiprocessing.Pool.map函数在全局名称空间中看不到变量

问题描述 投票:0回答:1

此玩具脚本失败:

import numpy as np
import multiprocessing as mp

def myFunc1(x):
    return x+c

if __name__ == '__main__':
    c = np.array([[1,1],[1,1]])
    b = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
    pool = mp.Pool(processes=1)
    result = pool.map(myFunc1,b)
    for i in range(len(result)):
        print(result[i])

有错误

RemoteTraceback: 
"""
Traceback (most recent call last):
  File "C:\Users\aldo.dottavio\anaconda3\lib\multiprocessing\pool.py", line 119, in worker
    result = (True, func(*args, **kwds))
  File "C:\Users\aldo.dottavio\anaconda3\lib\multiprocessing\pool.py", line 44, in mapstar
    return list(map(*args))
  File "C:\Users\aldo.dottavio\Projects\THEIAA\2020-02 parallel processing\untitled0.py", line 12, in myFunc1
    return x+c
NameError: name 'c' is not defined
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):

  File "C:\Users\aldo.dottavio\Projects\THEIAA\2020-02 parallel processing\untitled0.py", line 19, in <module>
    result = pool.map(myFunc1,b)

  File "C:\Users\aldo.dottavio\anaconda3\lib\multiprocessing\pool.py", line 266, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()

  File "C:\Users\aldo.dottavio\anaconda3\lib\multiprocessing\pool.py", line 644, in get
    raise self._value

NameError: name 'c' is not defined

我希望得到

[[2,3]
 [4,5]]
[[6,7]
 [8,9]]

作为结果,但相反,cmyFunc1中未定义。我认为这是由map引起的,并且通过使用mapmyFunc1应用于数据,myFunc1无法访问全局名称空间。

类似的玩具脚本成功:

import numpy as np

def myFunc1(x):
    return x+c

if __name__ == '__main__':
    c = np.array([[1,1],[1,1]])
    b = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
    result = myFunc1(b)
    for i in range(len(result)):
        print(result[i])

并输出结果

[[2 3]
 [4 5]]
[[6 7]
 [8 9]]

按预期。

以上只是为了说明问题;在实际的脚本中,函数更加复杂,必须在数千个矩阵上进行迭代。

我从全局名称空间中需要的变量是函数使用的参数;它们不会被任何进程更改,并且对于所有函数调用都是相同的-仅在脚本中此时才读取。

如何从map中的函数访问全局变量?我不想复制参数-参数只是大约1 MB的数据,但是我可以在迭代器中包含15,000左右的元素。

python-3.x multiprocessing global
1个回答
0
投票

我使用starmapitertools.product()]解决了此问题>

import numpy as np
import multiprocessing as mp
from itertools import product

def myFunc1(x,c):
    return x+c

if __name__ == '__main__':

    c = np.array([[1,1],[1,1]])
    b = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
    pool = mp.Pool(processes=1)
    result = pool.starmap(myFunc1,product(b,[c]))
    # result = myFunc1(b)
    for i in range(len(result)):
        print(result[i])

c

周围使用itertools.product和[]允许将整个数组c作为一个元素进行迭代,而不是遍历NumPy数组的第一个索引。
© www.soinside.com 2019 - 2024. All rights reserved.