2016-03-23 12 views
1

Aşağıdaki kodu bu link numaralı telefondan ilk yanıttan değiştirdim.Python uyurken bir iş parçacığı sonlandır

class StoppableThread(threading.Thread): 
    """Thread class with a stop() method. The thread itself has to check 
    regularly for the stopped() condition.""" 

    def __init__(self, target, timeout): 
     super(StoppableThread, self).__init__() 
     self._target = target 
     self._timeout = timeout 
     self._stop = threading.Event() 
     self.awake = threading.Event() 

    def run(self): 
     while(not self._stop.isSet()): 
      self.awake.clear() 
      time.sleep(self._timeout) 
      self.awake.set() 
      self._target() 

    def stop(self): 
     self._stop.set() 

    def stopped(self): 
     return self._stop.isSet() 

Ben bu sınıfın bir örneğini oluşturmak ve süreci deamon olarak ayarlayın sonra bunu daha sonra _target() işlevi tamamlamak ve için iplik uyurken başka, daha sonraki bir zamanda sonlandırmak beklemek istiyorum sonlandırabilir. İkinci durumu durma yöntemini arayarak halledebilirim. Ancak, _awake olay nesnesi False olarak ayarlandığında onu sonlandırma hakkında hiçbir fikrim yok. Birisi lütfen yardım edebilir mi?

cevap

1

Kişisel bilgileriniz açıkça sleep olmalıdır. Başka bir evre için durmasını istemek için bekleyebilir.

def run(self): 
    while(not self._stop.isSet()): 
     self.awake.clear() 
     self._stop.wait(self._timeout) # instead of sleeping 
     if self._stop.isSet(): 
      continue 
     self.awake.set() 
     self._target() 

Bu amaçla, size hiç awake olayı gerekmez. (Başka bir iş parçacığının "durumunu" kontrol etmek istiyorsa yine de buna ihtiyacınız olabilir. Bunun sizin için bir gereksinim olup olmadığını bilmiyorum).

awake olmadan, kod olacaktır:

class StoppableThread(threading.Thread): 

    def __init__(self, target, timeout): 
     super(StoppableThread, self).__init__() 
     self._target = target 
     self._timeout = timeout 
     self._stop = threading.Event() 

    def run(self): 
     while not self.stopped(): 
      self._stop.wait(self._timeout) # instead of sleeping 
      if self.stopped(): 
       continue 
      self._target() 

    def stop(self): 
     self._stop.set() 

    def stopped(self): 
     return self._stop.isSet() 
+0

Ben senin noktaya değindi. Şimdi, 'hedef' işlevinin sonsuz uzun süre çalışıp çalışmadığını söyleyin, onu nasıl incelerim? MySQL DB işlemlerini içerdiğinden dolayı incelikle sonlandırmalıyım. Yukarıdaki işlev gibi, zaman aşımı saniyesinden sonra periyodik olarak 'target' işlevini çalıştırabilen bu işlev için herhangi bir zaman aşımı koşulum yok. Bu işlev için bir sürücü işlevi oluşturur, sürücü işlevini yeni bir iş parçacığından çalıştırır ve '_stop' olay bayrağını yukarıdaki iş parçacığından geçirir mi? Yoksa daha iyi bir yolu var mı? – zorro

+0

@zorro, bu tamamen farklı bir soru olduğundan, yeni bir soru yayınlamalısınız (kural her posta başına bir sorundur) – shx2

+1

Tamam teşekkürler. Yapacağım. – zorro

İlgili konular