Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mengendalikan Gangguan Papan Kekunci dalam Kolam Berbilang Pemprosesan Python?

Bagaimana untuk Mengendalikan Gangguan Papan Kekunci dalam Kolam Berbilang Pemprosesan Python?

Susan Sarandon
Susan Sarandonasal
2024-10-22 14:22:03348semak imbas

How to Handle Keyboard Interrupts in Python's Multiprocessing Pool?

Mengendalikan Gangguan Papan Kekunci dalam Kolam Berbilang Pemprosesan Python

Dalam modul berbilang pemprosesan Python, kelas Pool menyediakan cara yang mudah untuk mengagihkan tugas merentasi pelbagai proses. Walau bagaimanapun, pengendalian acara KeyboardInterrupt dalam Pools boleh menjadi mencabar, seperti yang ditunjukkan oleh 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 menjalankan kod ini, menekan Ctrl C tidak akan mencetuskan proses pembersihan, meninggalkan subproses berjalan tanpa had. Untuk menangani isu ini, pertimbangkan penyelesaian berikut:

Tingkah laku yang diperhatikan dalam kod adalah akibat daripada pepijat Python. KeyboardInterrupt tidak dihantar apabila menunggu syarat dalam threading.Condition.wait(). Memandangkan Pool.map() menggunakan syarat tunggu secara dalaman, gangguan tidak pernah diterima.

Penyelesaian ialah menggunakan Pool.map_async(), yang membenarkan penetapan tamat masa. Dengan menetapkan tamat masa yang cukup lama (mis., 9999999), kami boleh memastikan bahawa gangguan akan dicetuskan dalam masa yang munasabah.

Oleh itu, 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>

Penyelesaian ini menyediakan cara untuk mengendalikan acara KeyboardInterrupt dengan anggun dalam Pools berbilang pemprosesan, membenarkan penamatan semua subproses apabila pengguna membatalkan program.

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Gangguan Papan Kekunci dalam Kolam Berbilang Pemprosesan 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