我将使用 this question 的答案作为我的起点,因为我觉得这是一个非常简单的最小示例,但我正在寻找这个问题的一般答案。我习惯于以这种方式在 python 中进行多重处理,其中实际工作所需的所有内容都封装在 if __name__
中。 ...这样的声明:
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 脚本启动多处理部分。但是,一旦我用函数定义替换 if 语句(或将其封装在函数定义中)并尝试运行该函数,我就会得到 AttributeError: 'module' object has no attribute 'foo'
:
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()
def main():
pool = ThreadPool(4) # Hint...
num_iter = [1,2,3,4,5]
out = pool.map(foo, num_iter)
print(out)
所以我的问题是,如何正确封装多处理,以便可以方便地从另一个模块、脚本等调用它?
您必须以某种方式使用if __name__=='__main__':
。
这是mp_test.py
:
import multiprocessing
import os
def worker():
"""worker function"""
print 'Worker'
return
def main(module_name):
jobs = []
print "The multiprocessing function in %s is called from %s" %(os.path.basename(__file__),module_name)
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
这是main.py
:
from imsho import *
import os
if __name__ =='__main__':
main(os.path.basename(__file__))
结果:
The multiprocessing function in mp_test.pyc is called from main.py
Worker
Worker
Worker
Worker
Worker
我是一名优秀的程序员,十分优秀!