Многопроцессорная обработка Python:Пул пользовательских Процессов
-
09-09-2019 - |
Вопрос
Я создаю подкласс класса Process в класс, который я называю EdgeRenderer .Я хочу использовать multiprocessing.Pool
, за исключением того, что вместо обычных процессов я хочу, чтобы они были экземплярами моего EdgeRenderer.Возможно?Каким образом?
Решение
От Джесси Ноллера:
В настоящее время это не поддерживается в API , но было бы неплохим дополнением.Я рассмотрю возможность добавления его в python2.7/2.6.3 3.1 на этой неделе
Другие советы
Я не вижу никакого хука для этого в API.Возможно, вам удастся избежать неприятностей с воспроизведением желаемой функциональности, используя initializer
и initargs
аргумент.В качестве альтернативы вы можете встроить функциональность в вызываемый объект, который вы используете для сопоставления:
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)
Кажется, это работает:
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)