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

  • DancingIsAPassion

    DancingIsAPa

    29 AĞUSTOS 2009
  • Liberator

    Liberator

    14 EYLÜL 2007
  • majesticdubstep

    majesticdubs

    3 Kasım 2011