如何将关键字列表传递给多道处理?

2024-10-04 07:39:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用病理学.多处理并行化需要使用实例方法的程序。以下是一个最低限度的工作示例:

import time
import numpy as np
from pathos.multiprocessing import Pool, ProcessingPool, ThreadingPool

class dummy(object):
    def __init__(self, arg, key1=None, key2=-11):

        np.random.seed(arg)

        randnum = np.random.randint(0, 5)

        print 'Sleeping {} seconds'.format(randnum)
        time.sleep(randnum)

        self.value = arg
        self.more1 = key1
        self.more2 = key2

args = [0, 10, 20, 33, 82] 
keys = ['key1', 'key2']
k1val = ['car', 'borg', 'syria', 'aurora', 'libera']
k2val = ['a', 'b', 'c', 'd', 'e']
allks = [dict(zip(keys, [k1val[i], k2val[i]])) for i in range(5)]

pool = ThreadingPool(4)
result = pool.map(dummy, args, k1val, k2val)

print [[r.value, r.more1, r.more2] for r in result]

打印结果为(如预期):

^{pr2}$

但是,在对map的调用中,最后两个参数的顺序很重要,如果我这样做:

result2 = pool.map(dummy, args, k2val, k1val)

我得到:

[[0, 'a', 'car'], [10, 'b', 'borg'], [20, 'c', 'syria'], [33, 'd', 'aurora'], [82, 'e', 'libera']]

我想得到和第一个结果一样的结果。该行为将与apply_asynckwds在标准模块multiprocessing中所能做的相同,即传递一个字典列表,其中每个字典中的键是关键字名称,项是关键字参数(请参见allks)。请注意,标准模块multiprocessing不能使用实例方法,因此甚至不满足最低要求。在

暂定为: 结果=池.map(dummy,args,kwds=allks)#这不起作用


Tags: importselfmapnpargargsmultiprocessingdummy
1条回答
网友
1楼 · 发布于 2024-10-04 07:39:26

我是pathos的作者。是啊,你偶然发现了一些我知道需要做点工作的事情。目前,map和{}(即ProcessPoolThreadPool)和{}的方法不能接受{},必须将它们作为args传递。但是,如果使用_ProcessPool_ThreadPool,那么可以将kwds传递给它们的map和{}方法。 以下划线开头的pathos.pools中的池实际上直接来自multiprocess,因此它们与multiprocessing中的池具有相同的api(但是具有更好的序列化,因此可以传递类方法等)。在

>>> from pathos.pools import _ProcessPool
>>> from multiprocess.pool import Pool
>>> Pool is _ProcessPool
True

因此,对原始代码的编辑将如下所示(来自OP建议的编辑):

^{pr2}$

相关问题 更多 >