我正在使用我用 Python 腳本呼叫的地下水建模可執行檔案 (HYDRUS1D)。我想做一些蒙特卡洛運行,但有時程式會掛起并且長時間不收斂。有沒有辦法給可執行檔案一定的運行時間,如果超過這個時間就取消它,然后在不中斷 Python 腳本的情況下開始一個新的模擬?模擬應該不超過 3-5 秒,所以我希望給它最多 10 秒的時間來完成。
我首先運行一個函式來更改模型的一些輸入引數,然后通過“run_single_sim”函式執行 Hydrus:
for value in n_variations_21:
for value2 in n_variations_23:
write_hydraulic_params('foo',layers,value,value2)
run_single_sim()
其中 run_single_sim() 通過 os.system 執行 Hydrus:
def run_single_sim():
os.system('./hydrus LEVEL_01.DIR')
我嘗試了一些涉及執行緒的解決方案,例如this和this;但似乎我的腳本卡在 os.system 呼叫上,因此無法檢查執行緒運行了多長時間或在腳本休眠一段時間后終止執行緒。
uj5u.com熱心網友回復:
您問“如何停止通過 Python 呼叫的可執行檔案 ...”,但我覺得這個問題只是關于“如何停止可執行檔案”。有趣的是,我們有一個可能行為不端的孩子。父級無趣,可能是 rust、ruby、隨機其他語言。
您提出的超時問題是一個明智的問題,在 GNU coreutils包中有一個針對它的答案。
代替
os.system('./hydrus LEVEL_01.DIR')
你要
os.system('timeout 10 ./hydrus LEVEL_01.DIR')
這是一個快速演示,使用比 Hydrus 更簡單的命令。
$ timeout 2 sleep 1; echo $?
0
$
$ timeout 2 sleep 3; echo $?
124
作為一個完全獨立的問題,更喜歡check_output()
舊的os.system().
您參考了一對處理執行緒的答案文章。但是您正在生成一個單獨的子行程,沒有共享記憶體,因此執行緒在這里無關緊要。我們希望最終向行為不良的行程發送 SIGTERM 信號,并希望它通過快速退出來服從信號。讓明確忽略此類信號的孩子超時將是一個稍微棘手的問題。--kill-after=duration可以使用該標志發送不可捕獲的 SIGKILL 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/517028.html
標籤:Python多线程造型
