[英]How to use multiprocess in python on a class object
我是Python的新手,我的经验是通过西门子PSS / e提供的API在Powerflow建模中使用的。 我有一个脚本,我已经使用了好几年,在大型数据集上运行一些模拟。
为了快速完成,我通常将输入分成多个部分,然后在IDLE中运行脚本的多个实例。 我最近为输入添加了一个GUI,并且已经改进了代码以使其更加面向对象,创建了一个GUI,它将GUI传递给输入但后来像原始脚本一样工作。
我的问题是如何从程序本身分割过程而不是制作多个副本? 我已经阅读了一些关于mutliprocess模块的内容,但我不确定如何将它应用于我的情况。 本质上我希望能够实例化N个相同的对象,每个对象并行运行。
我现在拥有的类(称为Bot)传递一组参数,并在运行时创建一个csv输出,直到它完成。 我有一个单独的代码块,最后将这些部分组合在一起但是现在我只需要了解在我的GUI中运行后将多个Bot对象踢掉的最佳方法。 Ther是GUI中的输入,用于指定要使用的N个段的数量。
如果我的问题很模糊,我会提前道歉。 感谢任何信息,因为我有点卡住,不知道在哪里寻找更好的答案。
创建配置列表:
configurations = [...]
创建一个采用相关配置的函数,并使用您的Bot
:
def function(configuration):
bot = Bot(configuration)
bot.create_csv()
创建一个具有多个CPU的工作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']
如果你想让生活稍微复杂一些,你可以使用multiprocess
而不是multiprocessing
,因为有更好的类支持和解释器工作。 您可以在下面看到,我们现在可以直接使用类实例上的方法,这在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
。
>>> import multiprocess as mp
>>> mp.freeze_support
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.