可调用多处理脚本
Callable multiprocessing script
我将使用 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
我将使用 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