每个核心具有固定参数的多处理

时间:2020-02-27 05:06:22

标签: python multiprocessing

我想运行python多进程,我想我了解基本的pool,pool.apply_async和进程。但是,是否有一种方法可以在每个内核上使用固定参数运行pool.apply_async?就像有4个人为您剪纸,每个人都有一把剪刀,但他们不会互相分享剪刀。

我认为使用pool.apply_async(func,arg)会将您的负载分配到内核,但是,每个内核是否都可能持有固定的参数,func可以将其作为参数接收(我猜它不会在arg中,因为arg只是正常参数)?

1 个答案:

答案 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()
相关问题