亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用python調用外部程序產生進程,優雅關閉的最佳實踐是什么?

使用python調用外部程序產生進程,優雅關閉的最佳實踐是什么?

慕工程0101907 2018-07-04 15:26:20
使用subprocess庫:try:     p = subprocess.Popen(["ping", "-c", "5", "www.bing.com"], stdout=subprocess.PIPE)     p.wait()     except KeyboardInterrupt as e:     p.terminate()或者使用sh庫:try:     p = sh.ping("-c", "5", "www.bing.com", _bg=True, _bg_exc=False,                  _out=sys.stdout, _err=sys.stderr)     p.wait()     except KeyboardInterrupt as e:     alive, _ = p.process.is_alive()         if alive:             p.process.terminate()這種結束外部進程的方式有什么缺點?
查看完整描述

1 回答

?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

這個問題的需求是使用python調用外部的第三方程序,類似shell腳本一樣。
如果是正常的多進程編程協作完成一個任務,那么當然最好的方式是兩個進程協作,即使用IPC的方式使父進程傳遞給子進程結束的信息,然后子進程自己優雅的退出。

而如果使用python調用外部的第三方命令,將其作為類似shell腳本的方式使用,由于無法修改外部程序的代碼,因此IPC的手段非常有限,僅僅限于向子進程發送信號。

那么該問題的思路就很清晰了,我之前有一次是使用terminate()函數結束子進程導致了子進程無法正常釋放資源(linux系統)。通過查詢文檔可知terminate()函數在linux系統下的行為是向進程發送SIGTERM。那么,問題的原因則是該第三方程序接收到SIGTERM信號后的處理邏輯有問題。

因此,結束該進程最好的方式是使用該第三方程序能夠接受的方式,這通過查閱該第三方程序的文檔可以得到。

比如說,命令行程序對SIGINT信號的考慮更完善,因為在終端使用時按Ctrl-C發送的就是SIGINT信號。因此,對于大部分的第三方程序,發送SIGINT信號更好:

p.process.signal(signal.SIGINT)


查看完整回答
反對 回復 2018-07-14
  • 1 回答
  • 0 關注
  • 658 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號