簡體   English   中英

來自Abaqus / CAE的Python多處理

[英]Python multiprocessing from Abaqus/CAE

我正在使用一個名為Abaqus / CAE 1的商業應用程序,內置Python 2.6解釋器和API。 我已經開發了一個長期運行的腳本,我試圖使用Python的multiprocessing模塊分成同時獨立的任務。 然而,一旦產生過程就會掛起。

該腳本本身僅使用Abaqus專有的cae模塊提供的各種對象/方法,只能通過首先啟動與Abaqus / CAE捆綁的Python來加載,然后使用Python的execfile執行我的腳本。

為了嘗試使多處理工作,我試圖運行一個避免訪問任何Abaqus對象的腳本,而只是執行計算並將結果打印到文件2 這樣,我可以從常規系統Python安裝以及與Abaqus捆綁在一起的Python運行相同的腳本。

使用以下任一方法從命令行運行時,下面的示例代碼按預期工作:

C:\some\path>python multi.py         # <-- Using system Python
C:\some\path>abaqus python multi.py  # <-- Using Python bundled with Abaqus

這會生成新進程,每個進程都會運行該函數並按預期將結果寫入文件。 但是,從Abaqus / CAE Python環境調用時使用:

abaqus cae noGUI=multi.py

然后Abaqus將啟動,自動導入自己的專有模塊,然后使用以下命令執行我的文件:

execfile("multi.py", __main__.__dict__)

全局命名空間arg __main__.__dict__由Abaqus設置。 然后,Abaqus成功檢查每個流程的許可證,生成新流程,......就是這樣。 這些進程已創建,但它們都掛起並且什么都不做。 沒有錯誤消息。

什么可能導致掛斷,我該如何解決? 是否有必須設置的環境變量? 是否有其他商業系統使用類似的程序,我可以從中學習/模仿?

請注意,任何解決方案都必須在Python 2.6標准庫中提供。

系統詳細信息:Windows 10 64位,Python 2.6,Abaqus / CAE 6.12或6.14

示例測試腳本:

# multi.py
import multiprocessing
import time

def fib(n):
    a,b = 0,1
    for i in range(n):
        a, b = a+b, a
    return a

def workerfunc(num):
    fname = ''.join(('worker_', str(num), '.txt'))
    with open(fname, 'w') as f:
        f.write('Starting Worker {0}\n'.format(num))
        count = 0
        while count < 1000:  # <-- Repeat a bunch of times.
            count += 1
            a=fib(20)
        line = ''.join((str(a), '\n'))
        f.write(line)
        f.write('End Worker {0}\n'.format(num))

if __name__ == '__main__':
    jobs = []
    for i in range(2):       # <-- Setting the number of processes manually
        p = multiprocessing.Process(target=workerfunc, args=(i,))
        jobs.append(p)
        print 'starting', p
        p.start()
        print 'done starting', p
    for j in jobs:
        print 'joining', j
        j.join()
        print 'done joining', j

1廣為人知的有限元分析包

2該腳本是用於fib()的相當標准的Python函數和來自PyMOTW的示例的混合

我必須寫一個答案,因為我還不能發表評論。

我可以想象的一個原因是python多處理使用它自己的非共享內存產生了一個全新的進程。 因此,如果您在腳本中創建一個對象,則啟動一個新進程,該新進程包含一個內存副本,並且您有兩個可以進入不同方向的對象。 當原始python進程中存在一些abaqus(我懷疑)時,它也會被復制,這個副本可能會產生這種行為。

作為一種解決方案,我認為您可以使用C擴展python (它可以在單個進程中使用多個核心)並在那里使用線程。

只是想說我遇到了這個問題。 我目前的解決方案是划分我的腳本。 如果您嘗試在給定模型上運行參數掃描,或在同一模型上運行幾何變化等,這可能對您有用。

我首先生成腳本來完成我的建模過程的每個部分:

  1. 使用CAE / Python生成輸入文件。
  2. 提取我想要的數據並將其放入文本文件中。

通過這些創建,我使用文本替換來快速生成每種類型的N個python腳本,每個我感興趣的離散參數集一個。

然后我在Python中編寫了一個並行處理工具,將多個Abaqus實例作為子進程調用。 這樣做如下:

  1. 通過subprocess.call為每個模型生成腳本調用CAE。 該腳本允許您選擇一次運行多少個實例,以防止您在服務器上獲取每個許可證。

  2. 使用相同的生成模型執行Abaqus解算器,每個作業的核心參數和使用的核心總數。

  3. 使用與1相同的過程提取數據。

在生成模型時反復檢查CAE的許可證會有一些開銷,但在我的測試中,能夠同時生成10個以上輸入文件的好處遠遠超過它。

如果您認為上面概述的過程對您的應用程序有幫助,我可以將一些腳本放在Github上。

干杯,內森

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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