使用 Python 在多處理池中處理鍵盤中斷
處理鍵盤中斷對於有效管理並行進程至關重要。多處理庫提供了一種建立可以並發執行任務的工作進程池的方法。但是,在執行這些進程期間啟動鍵盤中斷時會出現問題。
問題:
在給定的 Python 程式碼中,建立了一個 Pool 並嘗試使用 try-except 區塊來處理鍵盤中斷。然而, except 區塊中的對應程式碼永遠不會執行,導致程式掛起。
<code class="python">try: results = pool.map(slowly_square, range(40)) except KeyboardInterrupt: pool.terminate() print("You cancelled the program!") sys.exit(1)</code>
原因:
此問題是由Python 中的一個錯誤引起的,其中在threading.Condition.wait() 中等待條件時,不會發送鍵盤中斷。在多處理庫中,Pool使用條件變數來等待map()運算的結果。當鍵盤中斷發生時,條件變數 wait() 不會返回,從而阻止中斷被處理。
解決方案:
要解決此問題,有一個解決方法就是指定等待結果時的超時時間。這可以透過將map()呼叫替換為map_async().get(timeout)來實現,其中timeout設定為一個很大的值。
<code class="python">results = pool.map_async(slowly_square, range(40)).get(9999999)</code>
透過指定逾時,條件變數wait()即使鍵盤中斷尚未處理,也會回傳。這允許執行 except 區塊,從而能夠終止池並優雅地處理中斷。
以上是如何使用 Python 處理多處理池中的鍵盤中斷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!