可调用多处理脚本

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