Rumah > Artikel > pembangunan bahagian belakang > Cara Anggun Mengendalikan KeyboardInterrupt dengan Kolam Pemprosesan Berbilang dalam 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!