Python中的动态流程

6 python multithreading multiprocessing

我有一个关于Python多处理的问题。我正在尝试获取数据集,分成多个块,然后将这些块传递给并发运行的进程。我需要使用简单的计算方法来转换大型数据表(例如,电阻->热敏电阻的温度)。

下面列出的代码几乎可以按需工作,但是它似乎并没有产生任何新的进程(或者一次只有一个)。我是Python的新手,所以可能有一个解决此问题的简单方法。

提前致谢!

从多处理导入过程

工人(过程)类:
    #数据转换示例
    def进程(self,x):返回(x * 2)/ 3

    def __init __(自己,列表):
        self.data =列表
        self.result =地图(self.process,self.data)
        超级(工人,自我).__ init __()

如果__name__ =='__main__':
    开始= datetime.datetime.now()
    数据集= range(10000)#空数据集
    流程= 3

    对于我在范围内(过程):
        块= int(math.floor(len(数据集)/ float(进程)))

        如果i + 1 ==处理:
            余数= len(数据集)%处理
        否则:余数= 0

        tmp =数据集[i *块:(i +1)*块+余数]
        exec('worker'+ str(i)+'= Worker(tmp)')
        exec('worker'+ str(i)+'。start()')

    对于我在范围内(过程):
        exec('worker'+ str(i)+'。join()')
        #只是一个占位符,以确保集合的初始值符合预期
        exec('print worker'+ str(i)+'。result [0]')

小智 1

无需向每个进程发送块的数量,只需使用 get_nowait() 并处理最终的 Queue.Empty 异常。每个进程都会获得不同数量的 CPU 时间,这会让它们都忙碌起来。

import multiprocessing, Queue

class Worker(multiprocessing.Process):
    def process(self, x): 
        for i in range(15):
            x += (float(i) / 2.6)
        return x

    def __init__(self, input, output):
        self.input = input
        self.output = output
        super(Worker, self).__init__()

    def run(self):
        try:
            while True:
                self.output.put(self.process(self.input.get_nowait()))
        except Queue.Empty:
            pass


if name == 'main':
    dataset = range(10)
    processes = multiprocessing.cpu_count()
    input = multiprocessing.Queue()
    output = multiprocessing.Queue()

    for obj in dataset:
        input.put(obj)
    for i in range(processes):
        Worker(input, output).start()

    for i in range(len(dataset)):
        print output.get()
Run Code Online (Sandbox Code Playgroud)