SORU
5 AĞUSTOS 2012, Pazar


Ctrl-C ile Python betiği öldürmek

Aşağıdaki komut ile Python diş çekme test ediyorum:

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()

Bu web geliştirme-11.10 üzerinde Python 2.7 çalışıyor.CtrlCöldürecek değil. Ben de sistem sinyalleri için bir işleyicisi ekleyerek denedim, ama yardım etmedi:

import signal 
import sys
def signal_handler(signal, frame):
        sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)

Arka plan için program gönderdikten sonra PID ile öldürüyorum süreci öldürmek içinCtrlZumursanmamaktan değil., NedenCtrlCumursanmamaktan ısrarla? Bunu nasıl çözebilirim?

CEVAP
5 AĞUSTOS 2012, Pazar


CtrlCsalondaki ana konu, ama konuları daemon modunda değil, çünkü gitmesini sağlıyor ve bu süreci canlı tutuyor. Onları cinleri yapabiliriz:

f = FirstThread()
f.daemon = True
f.start()
s = SecondThread()
s.daemon = True
s.start()

Ama sonra başka bir sorun var - ana iş parçacığı iş parçacığı başladıktan sonra, hiçbir şey yapmak için başka bir şey yok. Yani çıkar ve konuları anında yok edilir. Yani ana konu canlı kalsın:

import time
while True:
    time.sleep(1)

Şimdi baskı devam edecek 'ilk' ve 'ikinci' vurmak kadarCtrlC.

Düzenleme:ziyaretçi belirttiği gibi, daemon konuları geçici dosyaları gibi şeyleri temizlemek için bir şans olmayabilir. Eğer ihtiyacınız varsa, daha sonra ana iş parçacığı KeyboardInterrupt yakalayıp koordine ve kapatma temizleme var. Ama birçok durumda, daemon konuları aniden ölmesi yeterince iyi herhalde.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • eyes4beautee

    eyes4beautee

    17 HAZİRAN 2011
  • Perihelion

    Perihelion

    23 NİSAN 2008
  • sebsebdouze

    sebsebdouze

    7 ŞUBAT 2008