[英]Python Multiprocessing with shared data source and multiple class instances
我的程序需要产生一个类的多个实例,每个实例都处理来自流数据源的数据。
例如:
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()
我得出的结论是,有必要使用multiprocessing.Queues来解决这个问题。 数据源(流API)需要将数据的副本传递给所有不同的进程,以便它们可以使用它。
还有另一种方法可以使用multiprocessing.Manager来创建共享字典,但是我没有对其进行进一步的研究,因为它看起来效率很低并且无法传播对内部值的更改(例如,如果您有列表的字典,则更改为内部列表将不会传播)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.