我的程序需要生成一个类的多个实例,每个实例都处理来自流数据源的数据。
例如:
parameters = [1, 2, 3]
class FakeStreamingApi:
def __init__(self):
pass
def data(self):
return 42
pass
class DoStuff:
def __init__(self, parameter):
self.parameter = parameter
def run(self):
data = streaming_api.data()
output = self.parameter ** 2 + data # Some CPU intensive task
print output
streaming_api = FakeStreamingApi()
# Here's how this would work with no multiprocessing
instance_1 = DoStuff(parameters[0])
instance_1.run()
实例运行后,他们不需要互相交流,只需要获取数据。(并打印错误消息等)
我完全不知道如何使用多处理来完成这项工作,因为我首先必须创建类DoStuff的新实例,然后让它运行。
绝对不是这样做的方法:
# Let's try multiprocessing
import multiprocessing
for parameter in parameters:
processes = [ multiprocessing.Process(target = DoStuff, args = (parameter)) ]
# Hmm, this doesn't work...
我们可以尝试定义一个函数来生成类,但这看起来很难看:
import multiprocessing
def spawn_classes(parameter):
instance = DoStuff(parameter)
instance.run()
for parameter in parameters:
processes = [ multiprocessing.Process(target = spawn_classes, args = (parameter,)) ]
# Can't tell if it works -- no output on screen?
另外,我不希望运行3个不同的API接口类副本,我希望在所有进程之间共享数据......据我所知,多处理创建副本每个新流程的一切。
想法?
修改 我想我可能已经得到了......这有什么不妥吗?
import multiprocessing
parameters = [1, 2, 3]
class FakeStreamingApi:
def __init__(self):
pass
def data(self):
return 42
pass
class Worker(multiprocessing.Process):
def __init__(self, parameter):
super(Worker, self).__init__()
self.parameter = parameter
def run(self):
data = streaming_api.data()
output = self.parameter ** 2 + data # Some CPU intensive task
print output
streaming_api = FakeStreamingApi()
if __name__ == '__main__':
jobs = []
for parameter in parameters:
p = Worker(parameter)
jobs.append(p)
p.start()
for j in jobs:
j.join()
答案 0 :(得分:0)
我得出的结论是,有必要使用multiprocessing.Queues来解决这个问题。数据源(流API)需要将数据副本传递给所有不同的进程,因此他们可以使用它。
还有另一种方法可以使用multiprocessing.Manager来创建一个共享的dict,但我没有进一步探索它,因为它看起来效率很低,并且不能将更改传播到内部值(例如,如果你有一个列表的字典,对内部列表的更改不会传播。)