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

Susan Sarandon
Lepaskan: 2024-10-22 14:22:03
asal
261 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

dengan:

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

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!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!