2009-08-05 11 views
36
import multiprocessing 
import time 

class testM(multiprocessing.Process): 

    def __init__(self): 
     multiprocessing.Process.__init__(self) 
     self.exit = False 

    def run(self): 
     while not self.exit: 
      pass 
     print "You exited!" 
     return 

    def shutdown(self): 
     self.exit = True 
     print "SHUTDOWN initiated" 

    def dostuff(self): 
     print "haha", self.exit 


a = testM() 
a.start() 
time.sleep(3) 
a.shutdown() 
time.sleep(3) 
print a.is_alive() 
a.dostuff() 
exit() 

Sadece yukarıdaki kodun gerçekten "çıktınız" yazdıramadığını merak ediyorum. Neyi yanlış yapıyorum? eğer öyleyse, birisi bana nazikçe çıkmak için doğru yolu işaret edebilir mi? (Ben process.terminate ya da kill atıfta değilim)Python Çoklu İşlem Çıkış Zarif Nasıl?

+0

Aslında tüm bu kod, sizi vermelidir:

Aşağıdaki kodu deneyin. Başka bir deyişle: Muhtemelen son sekiz satırı kesmek istersiniz. – balpha

+1

Not: Bu örnek kod win32'de başarısız olacaktır çünkü ana komut dosyasını bir güvenlik yankısı ile korumamışsınızdır: 'Eğer __name__ ==" __main__ ": ... – jkp

cevap

39

Bunun gerçekleşmemesinin nedeni, alt işlemle iletişim kurmamanızdır. Çocuğa kapanması gerektiğini bildirmek için yerel bir değişken (ana işlem için yerel) kullanmaya çalışıyorsunuz.

synchonization primatives'daki bilgilere bir göz atın. Her iki işlemde de referans verilebilecek bir çeşit bir sinyal ayarlamanız gerekir. Bunu yaptıktan sonra anahtarınızı ana işlemde sürükleyebilmeniz ve çocuğun ölmesini bekleyebilmeniz gerekir. Bir NameError olduğu olduğu gibi sınıf oluşturma sırasında sınıf örneğini oluşturmak için çalışıyoruz çünkü

import multiprocessing 
import time 

class MyProcess(multiprocessing.Process): 

    def __init__(self,): 
     multiprocessing.Process.__init__(self) 
     self.exit = multiprocessing.Event() 

    def run(self): 
     while not self.exit.is_set(): 
      pass 
     print "You exited!" 

    def shutdown(self): 
     print "Shutdown initiated" 
     self.exit.set() 


if __name__ == "__main__": 
    process = MyProcess() 
    process.start() 
    print "Waiting for a while" 
    time.sleep(3) 
    process.shutdown() 
    time.sleep(3) 
    print "Child process state: %d" % process.is_alive() 
+0

thx man, sadece API için VALUE ve bunun değişebilir olduğunu düşünmüyorum. Bu, uygulamanızda harika çalışır. Thx çok –

+3

Kapatma çağrıldıktan sonra 3 saniye beklemek yerine (3 sn'den daha uzun sürecekse), işlem tamamlandığında işlemi sonlandırmak için sürecine katılabilirsiniz -> process.join() –

+0

Orijinal örneği: Ben hiç beklemezdim! (Senin önerdiğin şeyi yapardım). – jkp