如何在类obj上使用python中的多进程

2024-06-02 05:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python还比较陌生,我的经验是通过Siemens PSS/e中提供的API来使用Python进行电力流建模。我有一个脚本,我已经使用了几年,可以在大型数据集上运行一些模拟。在

为了快速完成,我通常将输入分成多个部分,然后在空闲状态下运行脚本的多个实例。最近,我为输入添加了一个GUI,并对代码进行了改进,使之更面向对象,创建了一个类,GUI将输入传递给这个类,但它的工作方式与原始脚本相同。在

我的问题是如何从程序本身中分离进程,而不是复制多个副本?我读过一些关于多进程模块的文章,但我不确定如何将其应用于我的情况。本质上,我希望能够实例化同一对象的N个数,每个对象都并行运行。在

我现在拥有的类(称为Bot)被传递一组参数,并在运行到结束时创建一个csv输出。我有一个单独的代码块,它在最后将这些部分组合在一起,但现在我只需要了解在我的GUI中点击run之后,如何将多个Bot对象踢出。GUI中有一些输入,用于指定要使用的N个段的数量。在

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


Tags: 数据对象实例代码脚本api进程bot
2条回答

创建配置列表:

configurations = [...]

创建一个接受相关配置并利用Bot的函数:

^{pr2}$

创建一个Pool的worker,其中包含要使用多少个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']

如果您想让生活变得简单一点,可以使用multiprocess而不是{},因为这样可以更好地支持类以及在解释器中工作。您可以在下面看到,我们现在可以直接在类实例上使用方法,这在multiprocessing中是不可能的。在

>>> from multiprocess import Pool
>>> import os
>>> 
>>> class Bot(object):
...   def __init__(self, x): 
...     self.x = x
...   def doit(self, y):
...     pid = os.getpid()
...     return (pid, self.x + y)
... 
>>> p = Pool()
>>> b = Bot(5)
>>> results = p.imap(b.doit, range(4))
>>> print dict(results)
{46552: 7, 46553: 8, 46550: 5, 46551: 6}
>>> p.close()
>>> p.join()

在上面,我使用imap来获取结果的迭代器,我将把它转储到dict中。请注意,您应该在完成后关闭您的池,以清理。在Windows上,您可能还需要查看freeze_support,以防代码无法运行。在

^{pr2}$

相关问题 更多 >