【发布时间】:2017-09-29 19:40:25
【问题描述】:
我正在尝试从 multiprocessing.Process 继承一个子类,该子类将在每个瞬间都有一个队列,以便可以使用该队列来捕获目标的返回值。 但问题是 multiprocessing.Process.start() 使用 subprocess.Popen (https://github.com/python/cpython/blob/master/Lib/multiprocessing/process.py) 创建一个进程并在其中运行目标。有没有办法在不定义/重载整个 Process 模块的情况下重载它。
这就是我想要做的:
class Mprocessor(multiprocessing.Process):
def __init__(self, **kwargs):
multiprocessing.Process.__init__(self, **kwargs)
self._ret = Queue.Queue()
def run(self):
self._ret.put(multiprocessing.Process.run(self))
def getReturn(self):
if self._ret.empty:
return None
return self._ret.get()
在这里,我尝试在类中创建一个 multiprocessig.Queue。 我覆盖了“运行”方法,因此当它被执行时,目标的返回值被放入队列中。 我有一个使用 Mprocess 类在主函数中调用的“getReturn”方法。仅当“Mprocess.isalive()”方法(为 multiprocessing.Process 定义)返回 false 时才应调用此方法。 但是这种机制不起作用,因为当我调用“Mprocess.start()”时,它会创建一个在自己的环境中运行目标的子进程。 我想知道有没有办法在start方法中使用队列来获取返回值,避免目标有队列参数进行通信。 我想概括这个模块。 我不希望我的方法被定义为有一个队列来获取返回值。 我想要一个模块,以便它可以适用于任何功能,因为我计划有一个管理器方法,它需要一个 dict["process_name/ID" : methods/targets],一个 dict["process name/ID " : [argument_list]] 并为每个目标创建一个进程并返回一个 dict["process_name/ID" : (return tuple, )。 任何想法都会受到欢迎。
编辑 经理职能:
def Processor_call(func = None, func_args = None):
if sorted(func.keys()) != sorted(func_args()):
print "Names in func dict and args dict doesn't match"
return None
process_list = multiprocessing.Queue()
for i in func.keys():
p = Mprocessor(name = i, target = func[i], args = tuple(func_args[i]))
process_list.put(p)
p.start()
return_dict = {}
while not process_list.empty():
process_wait = process_list.get()
if not process_wait.is_alive():
process_wait.join()
if process_wait.exitcode == 0:
return_dict[process_wait.name] = process_wait.getReturn()
else:
print "Error in process %s, status not availabe" %process_wait.name
else:
join_process.put(process_wait)
return return_dict
EDIT:目标函数应该如下所示。
def sum(a , b):
return a + b
我不想将队列传递给函数,然后返回队列。 我想制作一个通用模块,以便任何现有方法都可以使用多处理而不更改其定义,因此保持与其他模块的接口。 我不希望一个函数被设计成只作为一个进程运行,我希望有一个通用的接口,以便其他模块也可以使用这个函数作为一个正常的方法,而不必费心从队列中读取来获取返回价值。
【问题讨论】:
标签: python python-multiprocessing