我想运行python多进程,我想我了解基本的pool,pool.apply_async和进程。但是,是否有一种方法可以在每个内核上使用固定参数运行pool.apply_async?就像有4个人为您剪纸,每个人都有一把剪刀,但他们不会互相分享剪刀。
我认为使用pool.apply_async(func,arg)会将您的负载分配到内核,但是,每个内核是否都可能持有固定的参数,func可以将其作为参数接收(我猜它不会在arg中,因为arg只是正常参数)?
答案 0 :(得分:0)
Pool
尚未设置为分别参数化每个工作进程。但是,您可以将通用的初始化程序传递给每个进程,只要您能找出一种使该进程执行某些独特操作(例如锁定,读取和删除文件)的方法,然后就可以将某些内容合并在一起。操作系统级别的管道和消息队列很有趣,但是我尝试了一个Manager.Queue,它似乎可以解决问题。
import multiprocessing as mp
import os
import time
def _pool_init(q):
global unique_thing
unique_thing = q.get()
print("process {} unique {}".format(os.getpid(), unique_thing))
def _pool_worker(param):
time.sleep(.1) # work really hard
return "{}: {}".format(unique_thing, param)
def test():
# distribute unique things to the processes running the pool
unique_things = [1,2,3,4]
init_q = mp.Manager().Queue()
for u in unique_things:
init_q.put(u)
pool = mp.Pool(len(unique_things), initializer=_pool_init, initargs=(init_q,))
for result in pool.map(_pool_worker, 'ABCDEFG'):
print(result)
if __name__ == "__main__":
import sys
if len(sys.argv) == 2:
mp.set_start_method(sys.argv[1]) # "spawn" windows style or "fork" linux style
test()