多处理AttributeError模块对象没有属性'__path__'

时间:2014-09-10 05:17:38

标签: python python-3.x multiprocessing

我有一个很长的脚本,最后需要为巨大列表的所有项目运行一个函数需要很长时间,例如考虑:

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)

这些代码的输出,运行变化但是所有运行的共同点是整个脚本的几次运行,似乎通过将7分配为Pool,整个脚本将运行大约8次!

enter image description here

我不确定我是否很好地掌握了多处理的概念,但我认为它应该做的只是使用几个CPU运行函数'input_analyzer'而不是多次运行整个脚本。在我的真实代码的情况下,它如此长,它给了我一个奇怪的错误:

enter image description here

没有使用多处理我运行此代码就好了,我不知道我在这里做错了什么特别是错误“AttributeError module object没有属性'路径'”我很感激任何帮助。

2 个答案:

答案 0 :(得分: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时,我没有发现这是一个问题。

答案 1 :(得分:2)

多处理需要能够导入您的模块,如the documentation顶部所述。

您在模块(全局)范围内有大量代码,因此每次导入模块时都会运行此代码。

将它放在if __name__ == '__main__'块中,或者更好的是,放在函数中。