如何将关键字列表传递给 pathos.multiprocessing?

Posted

技术标签:

【中文标题】如何将关键字列表传递给 pathos.multiprocessing?【英文标题】:How to pass keywords list to pathos.multiprocessing? 【发布时间】:2017-02-06 09:21:14 【问题描述】:

我正在使用 pathos.multiprocessing 来并行化需要使用实例方法的程序。这是一个最小的工作示例:

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]

打印的结果是(如预期的那样):

Sleeping 4 seconds
Sleeping 1 seconds
Sleeping 3 seconds
Sleeping 4 seconds
Sleeping 3 seconds
[[0, 'car', 'a'], [10, 'borg', 'b'], [20, 'syria', 'c'], [33, 'aurora', 'd'], [82, 'libera', 'e']]

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

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

我得到:

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

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

暂定是: result = pool.map(dummy, args, kwds=allks) # 这个不行

【问题讨论】:

【参考方案1】:

我是pathos 作者。是的,你碰到了我知道需要一点工作的东西。目前,来自ProcessPoolThreadPoolParallelPoolmappipe(即apply)方法不能采用kwds——您必须将它们作为args 传递。但是,如果您使用_ProcessPool_ThreadPool,那么您可以将kwds 传递给它们的mapapply 方法。 pathos.pools 中以下划线开头的池实际上直接来自 multiprocess,因此它们具有与 multiprocessing 中相同的 API(但具有更好的序列化,因此可以传递类方法等)。

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

因此,对原始代码的编辑看起来像这样(来自 OP 的建议编辑):

>>> from pathos.pools import _ThreadPool
>>> pool = _ThreadPool(4)
>>> 
[…]
>>> result = []
>>> def callback(x):
>>>    result.append(x)
>>>
>>> for a, k in zip(args, allks):
>>>     pool.apply_async(dummy, args=(a,), kwds=k, callback=callback)
>>> 
>>> pool.close()
>>> pool.join()

【讨论】:

衷心感谢您花时间和精力开发pathos。解决我的具体问题的额外荣誉。

以上是关于如何将关键字列表传递给 pathos.multiprocessing?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 视图需要将选定的下拉列表和日历日期传递给模型

如何将对象列表传递给函数,该函数需要实现接口的对象列表?

如何通过 cython 将 numpy 数组列表传递给 c++

如何将单击的列表项值传递给另一个活动?

jQuery DatePicker:如何将年份数组传递给 yearRange 下拉列表

如何将对象列表传递给控制器​​?