2013-08-07 11 views
9

kapatıldı Algılama: tercüman kapatmaya sırasındaTercüman Bu böcek tarafından vuruldu cin iplik

http://bugs.python.org/issue1856 Daemon ipler segfault.

Şimdi bu hatayı kodlamak için bir yol arıyorum. Şu anda

kod şuna benzer:

while True: 
    do_something() 
    time.sleep(interval) 

tercüman() do_something önce hala kullanılabilir olup olmadığını kontrol etmek için bir yolu var mı?

Veya mythread.setDaemon (True) ve ana iş parçacığının çıkıp çıkmadığını kontrol etmek daha iyi mi?

import sys as _sys 

class Thread(_Verbose): 
    def _bootstrap_inner(self): 
     # some code 

      # If sys.stderr is no more (most likely from interpreter 
      # shutdown) use self._stderr. Otherwise still use sys (as in 
      # _sys) in case sys.stderr was redefined since the creation of 
      # self. 
      if _sys: 
       _sys.stderr.write("Exception in thread %s:\n%s\n" % 
        (self.name, _format_exc())) 
      else: 
       # some code 

yararlı olabilir:

+1

İlgili: http://stackoverflow.com/questions/16731115/how-to-debug-a-python-seg-fault – guettli

cevap

5

Cevap yok setDaemon (Doğru), uyku() kullanın parent_thread.join()

while True: 
    parent_thread.join(interval) 
    if not parent_thread.is_alive(): 
     break 
    do_something() 

İlgili kullanmayın: http://docs.python.org/2/library/threading.html#threading.Thread.join

+0

Anlamadım. Eğer bir çocuk iş parçacığı daemon değilse, o zaman bir ebeveyn iş parçacığı ölmez (çocuktan önce) ve böylece ebeveyn üzerindeki 'is_alive' her zaman doğru olacaktır. Yani Bu kontrol tamamen anlamsız. Bir çocuk iş parçacığı daemon olsa da işe yarayabilir. – freakish

+1

@ Ana (ana) iş parçacığının sonuna ulaşılmışsa, is_alive() öğesi yanlış döndürür, ancak alt iş parçacığı hala canlıdır. Testlerimde çalışıyor. – guettli

+0

İlginç. Test ettim ve haklısın: işe yarıyor. – freakish

0

Bu den modülünün threading.py bir koddur. Gördüğünüz hata else ifadesinden geliyor. Yani sizin durumda: olsa çalışıp çalışmadığını

import sys as _sys 

while True: 
    if not _sys: 
     break/return/die/whatever 
    do_something() 
    time.sleep(interval) 

emin değilim (yani yorumlayıcı kapatma yüzden muhtemelen try:except: ile herşeyi yerleştirilmeli do_something içine ortaya çıkabilir dikkat edin). Daemon iplikleri mutlaka kötü değildir, kesinlikle geliştirme sürecini hızlandırabilirler. Sadece onlara dikkat etmelisin. Şimdi bu modeli kullanan

: Kendi soruya