2010-11-09 13 views
19

KeyboardInterrupt özel durumunun yalnızca Python'daki ana iş parçacığı tarafından okunan bir yeri okuyorum. Çocuk iş parçacığı yürütülürken ana iş parçacığının engellendiğini de okudum. Yani, bu, CTRL + C'un asla çocuk parçacığına ulaşamayacağı anlamına gelir. yürütme CTRL + C hiçbir etkisi yoktur Bu durumdaCtrl-c i.e. KeyboardItest içinde konuları öldürmek için başarısız

def main(): 
    try: 
     thread1.start() #thread is totally blocking e.g. while (1) 
     thread1.join() 
    except KeyboardInterrupt: 
     print "Ctrl-c pressed ..." 
     sys.exit(1) 

: Aşağıdaki kodu çalıştı. Kesintiyi dinleyemediği gibi. Bunu yanlış anladım mı? CTRL + C kullanarak iş parçacığını öldürmenin başka bir yolu var mı?

+0

http://stackoverflow.com/questions/323972/is-there gör -yükleme-bir-diş-içinde-python –

+5

Başka bir iş parçacığı başlattığınız için ana iş parçacığı engellenmiyor. Bu doğru olsaydı konuların noktası ne olurdu? Çünkü iş parçacığı 1 yapılıncaya kadar iş parçacığı olan thread1.join() işlevini çağırıyorsunuz. – Falmarri

cevap

9

Sorun şu ki, thread1.join() kullanıyorsunuz, bu da programınızın devam etmek için iş parçacığı bitene kadar beklemesine neden olacak.

Sinyaller her zaman ana işlem tarafından yakalanacaktır, çünkü sinyalleri alan, iş parçacığı olan işlemdir.

Gösterdiğiniz gibi, 1 iş parçacığına sahip olduğunuzdan ve devam etmek için bitirinceye kadar beklemeden, temel olarak 'normal' bir uygulama çalıştırıyorsunuz. Eğer katılma işlemi CTRL + C sinyal almak ana iş parçacığı sahip olmak istiyorsanız

12

, bu join() çağrısına zaman aşımı ekleyerek yapılabilir.

şu çalışıyor görünüyor (aslında ana bitmesini istiyorsanız daemon=True eklemeyi unutmayın):

thread1.start() 
while True: 
    thread1.join(600) 
    if not thread1.isAlive(): 
     break 
İlgili konular