2013-01-12 15 views
12

aşağıdaki sınıfları düşünün:Bir iş parçacığı yeniden başlatılırken örnek neden yeniden oluşturulmalıdır?

Class Object(threading.Thread): 
    # some initialisation blabla 
    def run(self): 
     while True: 
      # do something 
      sleep(1) 

class Checker(): 
    def check_if_thread_is_alive(self): 
     o = Object() 
     o.start() 

     while True: 
      if not o.is_alive(): 
       o.start() 

ÖIü olması durumunda iplik yeniden başlatmak istiyorum. Bu işe yaramıyor. Çünkü iş parçacığı sadece bir kez başlatılabilir. İlk soru. Bu neden?

Bildiğim kadarıyla, her bir Object örneğini yeniden oluşturmanız ve iş parçacığı yeniden başlatmak için start() numaralı telefonu aramam gerekiyor. Karmaşık Object s durumunda bu çok pratik değildir. Ben, eski Object geçerli değerlerini okumak yeni bir tane oluşturun ve eski değerlerle yeni nesnede parametrelerini ayarlamak için var. İkinci soru: Bu daha akıllı, daha kolay bir şekilde yapılabilir mi?

cevap

14

threading.Thread bu şekilde uygulandığı nedeni bir iplik nesne ve işletim sisteminin parçacığı arasındaki yazışmalar tutmaktır. majör işletim parçacığı olarak yeniden edilemez, ancak başka bir iş parçacığı kimliği başka konu oluşturabilir.

rekreasyon bir sorun ise, threading.Thread adresinin sınıfı miras gerek yoktur, sadece bu gibi yapıcısı Konu için bir hedef parametre geçirmek:

class MyObj(object): 
    def __init__(self): 
     self.thread = threading.Thread(target=self.run) 
    def run(self): 
     ... 

Sonra Erişebileceğiniz iplik üyesi kontrol etmek sizin iş parçacığı yürütme ve gerektiğinde yeniden oluşturun. MyObj rekreasyon gerekli değildir.

1

Buraya bakın: http://docs.python.org/2/library/threading.html#threading.Thread.start

Bu iş parçacığı nesnesi başına en fazla bir kere çağrılmalıdır. Ayrı bir denetim iş parçasında çağrılmak üzere nesnesinin run() yöntemini ayarlar.

Bu yöntem bir kez aynı diş nesne üzerinde daha fazla adı eğer RuntimeError yükseltecektir.

bir iplik

kereden fazla çalıştırmak için tasarlanmamıştır. Sen Thread sınıf nasıl uygulandığını ile ilgisi var, ben inanıyorum bir Thread Pool

0

kullanmak isteyebilirsiniz. Gerçek bir işletim sistemi iş parçacığı sarar, böylece iş parçacığının yeniden başlatılması aslında kafa karıştırıcı olabilecek kimliğini değiştirir.

class Worker(object): 
    """ Implements the logic to be run in separate threads """ 
    def __call__(self): 
     # do useful stuff and change the state 

class Supervisor(): 
    def run(self, worker): 
     thr = None 
     while True: 
      if not thr or not thr.is_alive(): 
       thr = Thread(target=worker) 
       thr.daemon = True 
       thr.start() 
      thr.join(1) # give it some time 
:

parçacığı ile başa çıkmak için daha iyi bir yol hedef fonksiyonları/callables aracılığıyla aslında

İlgili konular