簡體   English   中英

如何在類對象的python中使用multiprocess

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM