使用共享数据源和多个类实例的Python多处理

时间:2017-09-10 22:22:02

标签: python python-multiprocessing

我的程序需要生成一个类的多个实例,每个实例都处理来自流数据源的数据。

例如:

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()

1 个答案:

答案 0 :(得分:0)

我得出的结论是,有必要使用multiprocessing.Queues来解决这个问题。数据源(流API)需要将数据副本传递给所有不同的进程,因此他们可以使用它。

还有另一种方法可以使用multiprocessing.Manager来创建一个共享的dict,但我没有进一步探索它,因为它看起来效率很低,并且不能将更改传播到内部值(例如,如果你有一个列表的字典,对内部列表的更改不会传播。)