multiprocessing 属性错误:模块对象没有 '__path__' 属性

3 投票
2 回答
24227 浏览
提问于 2025-04-20 19:32

我有一个很长的脚本,最后需要对一个很大的列表中的所有项目运行一个函数,这个过程需要花费很长时间。比如说:

input_a= [1,2,3,4] # a lengthy computation on some data
print('test.1') # for testing how the script runs
input_b= [5,6,7,8]  # some other computation
print('test.2')

def input_analyzer(item_a): # analyzing item_a using input_a and input_b
     return(item_a * input_a[0]*input_b[2])

from multiprocessing import Pool
def analyzer_final(input_list):
    pool=Pool(7)
    result=pool.map(input_analyzer, input_list)
    return(result)

my_list= [10,20,30,40,1,2,2,3,4,5,6,7,8,9,90,1,2,3] # a huge list of inputs

if __name__=='__main__':
        result_final=analyzer_final(my_list)
        print(result_final)
    return(result)

这个代码的输出在每次运行时都不一样,但所有的运行都有一个共同点,就是整个脚本会运行好几次。看起来我把 Pool 设置为 7 后,整个脚本大约会运行 8 次!

enter image description here

我不太确定自己是否理解了多进程的概念,但我以为它应该只是用几个 CPU 来运行 'input_analyzer' 这个函数,而不是让整个脚本运行好几遍。在我的真实代码中,它非常长,并且给了我一个奇怪的错误:

enter image description here

在没有使用多进程的情况下,我运行这个代码是没问题的,我不知道我在这里做错了什么,尤其是错误信息“AttributeError module object has no attribute 'path'”。我非常感谢任何帮助。

2 个回答

3

多进程处理需要能够导入你的模块,这在文档的开头就提到了。

你有一堆代码放在模块的全局范围内,所以每次导入这个模块时,这些代码都会被执行。

把这些代码放在if __name__ == '__main__'这个块里面,或者更好的是,放在一个函数里。

4
from multiprocessing import Pool as ThreadPool
import requests


API_URL = 'http://example.com/api'
pool = ThreadPool(4) # Hint...

def foo(x):
  params={'x': x}
  r = requests.get(API_URL, params=params)
  return r.json()

if __name__ == '__main__':
  num_iter = [1,2,3,4,5]
  out = pool.map(foo, num_iter)
  print(out)

提示的回答:这就是为什么会出现异常的原因。池的定义是在 if __name__ == '__main__' 之外。

修复了...

from multiprocessing import Pool as ThreadPool
import requests


API_URL = 'http://example.com/api'

def foo(x):
  params={'x': x}
  r = requests.get(API_URL, params=params)
  return r.json()

if __name__ == '__main__':
  pool = ThreadPool(4) # Hint...
  num_iter = [1,2,3,4,5]
  out = pool.map(foo, num_iter)
  print(out)

Python文档也提到了这种情况:https://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers

我在使用multiprocessing.dummy时没有发现这个问题。

撰写回答