首頁  >  文章  >  後端開發  >  如何使用 Python 處理多處理池中的鍵盤中斷?

如何使用 Python 處理多處理池中的鍵盤中斷?

DDD
DDD原創
2024-10-22 16:35:02893瀏覽

How to Handle Keyboard Interruptions in Multiprocessing Pools with Python?

使用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn