如何在类对象的python中使用multiprocess

时间:2017-04-28 22:43:13

标签: python multiprocess psse

我是Python的新手,我的经验特别针对它通过西门子PSS / e提供的API在Powerflow建模中的使用。我有一个脚本,我已经使用了好几年,在大型数据集上运行一些模拟。

为了快速完成,我通常将输入分成多个部分,然后在IDLE中运行脚本的多个实例。我最近为输入添加了一个GUI,并且已经改进了代码以使其更加面向对象,创建了一个GUI,它将GUI传递给输入但后来像原始脚本一样工作。

我的问题是如何从程序本身分割过程而不是制作多个副本?我已经阅读了一些关于mutliprocess模块​​的内容,但我不确定如何将它应用于我的情况。本质上我希望能够实例化N个相同的对象,每个对象并行运行。

我现在拥有的类(称为Bot)传递了一组参数,并在运行时创建一个csv输出,直到它完成。我有一个单独的代码块,最后将这些部分组合在一起但是现在我只需要了解在我的GUI中运行后将多个Bot对象踢掉的最佳方法。 Ther是GUI中的输入,用于指定要使用的N个段的数量。

如果我的问题很模糊,我会提前道歉。感谢任何信息,因为我有点卡住,不知道在哪里寻找更好的答案。

1 个答案:

答案 0 :(得分:0)

创建配置列表:

configurations = [...]

创建一个采用相关配置的函数,并使用您的Bot

def function(configuration):
    bot = Bot(configuration)
    bot.create_csv()

创建一个Pool个工作人员,但要使用多个CPU:

from multiprocessing import Pool
pool = Pool(3)

多次调用该功能,配置列表中的每个配置。

pool.map(function, configurations)

例如:

from multiprocessing import Pool
import os

class Bot:
    def __init__(self, inputs):
        self.inputs = inputs

    def create_csv(self):
        pid = os.getpid()
        print('TODO: create csv in process {} using {}'
              .format(pid, self.inputs))


def use_bot(inputs):
     bot = Bot(inputs)
     bot.create_csv()


def main():
    configurations = [
        ['input1_1.txt', 'input1_2.txt'],
        ['input2_1.txt', 'input2_2.txt'],
        ['input3_1.txt', 'input3_2.txt']]

    pool = Pool(2)
    pool.map(use_bot, configurations)

if __name__ == '__main__':
    main()

输出:

TODO: create csv in process 10964 using ['input2_1.txt', 'input2_2.txt']
TODO: create csv in process 8616 using ['input1_1.txt', 'input1_2.txt']
TODO: create csv in process 8616 using ['input3_1.txt', 'input3_2.txt']