Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara Anggun Mengendalikan KeyboardInterrupt dengan Kolam Pemprosesan Berbilang dalam Python

Cara Anggun Mengendalikan KeyboardInterrupt dengan Kolam Pemprosesan Berbilang dalam Python

Linda Hamilton
Linda Hamiltonasal
2024-10-22 14:23:03669semak imbas

How to Gracefully Handle KeyboardInterrupt with Multiprocessing Pools in Python

Pengendalian Gangguan Papan Kekunci dalam Kolam Berbilang Pemprosesan: Perangkap Python

Dalam modul pemproses berbilang Python, acara KeyboardInterrupt nampaknya gagal menamatkan proses pekerja dalam Pool. Pertimbangkan coretan kod:

<code class="python">from multiprocessing import Pool
from time import sleep
from sys import exit

def slowly_square(i):
    sleep(1)
    return i*i

def go():
    pool = Pool(8)
    try:
        results = pool.map(slowly_square, range(40))
    except KeyboardInterrupt:
        # **** THIS PART NEVER EXECUTES. ****
        pool.terminate()
        print "You cancelled the program!"
        sys.exit(1)
    print "\nFinally, here are the results: ", results

if __name__ == "__main__":
    go()</code>

Apabila anda menekan Ctrl C untuk menaikkan KeyboardInterrupt, kod digantung selama-lamanya dan bukannya menamatkan Pool dengan anggun. Ini disebabkan oleh pepijat Python yang menghalang KeyboardInterrupt daripada mengganggu panggilan ke threading.Condition.wait().

Penyelesaian:

Penyelesaian penyelesaian adalah dengan menentukan tamat masa untuk operasi Pool. Gantikan:

<code class="python">    results = pool.map(slowly_square, range(40))</code>

dengan:

<code class="python">    results = pool.map_async(slowly_square, range(40)).get(9999999)</code>

Dengan menyatakan tamat masa yang besar secara sewenang-wenangnya, anda mengalih keluar gelagat menyekat dengan berkesan dan membenarkan gangguan diproses dengan segera. Ini akan menyebabkan semua proses pekerja keluar dengan anggun apabila Ctrl C ditekan.

Atas ialah kandungan terperinci Cara Anggun Mengendalikan KeyboardInterrupt dengan Kolam Pemprosesan Berbilang dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn