Python 多进程:自定义进程池

8

我正在将Process类子类化为EdgeRenderer类。 我想使用multiprocessing.Pool,但是我希望它们不是普通的进程,而是我的EdgeRenderer类的实例。 是否有可能? 如何实现?


你是想要编写多线程代码吗? - Brian Gianforcaro
3个回答

5

这似乎是有效的:

import multiprocessing as mp

ctx = mp.get_context()  # get the default context

class MyProcess(ctx.Process):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print("Hi, I'm custom a process")

ctx.Process = MyProcess  # override the context's Process

def worker(x):
    print(x**2)

p = ctx.Pool(4)
nums = range(10)
p.map(worker, nums)

3

来自Jesse Noller:

目前API不支持此功能,但是增加此功能并不是坏事。我会在本周内考虑将其添加到python2.7/2.6.3 3.1版本中。


2

我在API中没有看到任何钩子。您可能可以通过使用initializerinitargs参数来复制所需的功能。或者,您可以将功能构建到用于映射的可调用对象中:

class EdgeRenderTask(object):
    def op1(self,*args):
        ...
    def op2(self,*args):
        ...
p = Pool(processes = 10)
e = EdgeRenderTask()
p.apply_async(e.op1,arg_list)
p.map(e.op2,arg_list)

你不能将一个类作为参数传递给 p.map,否则会出现 pickle 错误。我发现唯一的解决方法是实现一种自定义的 pool.map……自己设置和提供进程。不幸的是,这需要更多的代码行。 - catwalker333

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接