在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  C/ 使用python調(diào)用外部程序產(chǎn)生進程,優(yōu)雅關(guān)閉的最佳實踐是什么?

使用python調(diào)用外部程序產(chǎn)生進程,優(yōu)雅關(guān)閉的最佳實踐是什么?

使用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()

這種結(jié)束外部進程的方式有什么缺點?

回答
編輯回答
有你在

自問自答下。

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

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

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

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

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

p.process.signal(signal.SIGINT)    
2018年8月19日 19:09