Saya menguji threading Python dengan skrip berikut:
import threading
class FirstThread (threading.Thread):
def run (self):
while True:
print 'first'
class SecondThread (threading.Thread):
def run (self):
while True:
print 'second'
FirstThread().start()
SecondThread().start()
Ini berjalan dengan Python 2.7 di Kubuntu 11.10. Ctrl+ Ctidak akan membunuhnya. Saya juga mencoba menambahkan penangan untuk sinyal sistem, tetapi itu tidak membantu:
import signal
import sys
def signal_handler(signal, frame):
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
Untuk menghentikan proses, saya membunuhnya dengan PID setelah mengirim program ke latar belakang dengan Ctrl+ Z, yang tidak diabaikan. Mengapa Ctrl+ Cterus-menerus diabaikan? Bagaimana cara mengatasi ini?
Jawaban:
Ctrl+ Cmenghentikan utas utama, tetapi karena utas Anda tidak dalam mode daemon, mereka tetap berjalan, dan itu membuat proses tetap hidup. Kita bisa menjadikannya daemon:
Tapi kemudian ada masalah lain - setelah utas utama memulai utas Anda, tidak ada lagi yang bisa dilakukan. Jadi itu keluar, dan utasnya langsung hancur. Jadi mari kita pertahankan utas utama:
Sekarang itu akan terus mencetak 'pertama' dan 'kedua' sampai Anda menekan Ctrl+ C.
Edit: seperti yang ditunjukkan oleh pemberi komentar, untaian daemon mungkin tidak mendapat kesempatan untuk membersihkan hal-hal seperti file sementara. Jika Anda membutuhkannya, tangkap
KeyboardInterrupt
di utas utama dan minta dia mengoordinasikan pembersihan dan penghentian. Tetapi dalam banyak kasus, membiarkan utas daemon mati secara tiba-tiba mungkin sudah cukup baik.sumber
tempfile.TemporaryFile()
mungkin tertinggal di disk, misalnya.daemon=True
keThread.__init__
KeyboardInterrupt dan sinyal hanya terlihat oleh proses (yaitu utas utama) ... Silahkan lihat Ctrl-c yaitu KeyboardInterrupt untuk mematikan utas di python
sumber
Saya pikir yang terbaik adalah memanggil join () di utas Anda ketika Anda mengharapkan mereka mati. Saya telah mengambil kebebasan dengan kode Anda untuk membuat loop berakhir (Anda dapat menambahkan kebutuhan pembersihan apa pun yang diperlukan di sana juga). Variabel dadu diperiksa kebenarannya pada setiap lintasan dan ketika Benar maka program keluar.
sumber
while True
konyol, Anda harusjoin
secara langsung - dan fungsi penggantian itu agak dipertanyakan. Mungkindef join(self, force=False): if force: self.die = True
agarjoin()
tidak berubah denganjoin(force=True)
membunuh mereka. Tetapi meskipun demikian, lebih baik memberi tahu kedua utas sebelum bergabung dengan salah satunya.Versi perbaikan dari jawaban @Thomas K:
is_any_thread_alive()
menurut inti ini , yang dapat menghentikanmain()
secara otomatis.Kode contoh:
sumber