2015-05-06 24 views
5

Benim kodunda sinyallerini işlemek gerekiyor ve işlevler arasında durum paylaşımına küresel kullanıyorum:Tek bir modülün içinde durumu paylaşmanın Pythonic yolu nedir?

exit = False 

def setup_handler(): 
    signal.signal(signal.SIGTERM, handler) 

def handler(num, frame): 
    global exit 
    exit = True 

def my_main(): 
    global exit 
    while not exit: 
     do_something() 

if __name__ == '__main__': 
    setup_handler() 
    my_main() 

bu durumda global değişkeni önlemenin bir yolu var mı? Bu durumda devleti paylaşmanın en iyi yolu nedir?

+1

İşlemcinin izin verdiği kadar hızlı bir şekilde "do_something" yapmak istiyor musunuz? Belirli bir zaman çözünürlüğüne sahipseniz, 'my_main' işlevini 'her' n' saniyesinde 'işleyici' olarak adlandırmalısınız. –

+0

@Asad, netlik için basitleştirilmiş bir koddur. İşlemcinin izin verdiği kadar hızlı çalışmıyor. – Cory

cevap

6

Modülü global olarak kapsüllemek için bir sınıf kullanabilirsiniz, ancak yapmaya değer olup olmadığını globalden ne kadar kaçınmak istediğinize bağlıdır.

class EventLoop(object): 
    def __init__(self): 
     self.exit = False 

    def run(self): 
     while not self.exit: 
      do_something() 

    def handler(self): 
     self.exit = True  

# It's up to you if you want an EventLoop instance 
# as an argument, or just a reference to the instance's 
# handler method. 
def setup_handler(event_loop): 
    signal.signal(signal.SIGTERM, event_loop.handler) 


if __name__ == '__main__': 
    loop = EventLoop() 
    setup_handler(loop) 
    loop.run() 
+0

Bir sınıf gitmek için bir yoldur. Bu tür birden çok durumunuz varsa, durumu bir "yapılandırma sınıfı" içine koyabilirsiniz ve bu yapılandırma sınıfını durumları açık bir şekilde paylaşmalarına izin vermek için birkaç sınıfın __init __() yöntemlerine geçirebilirsiniz. –

+0

Bu, yalnızca belirli iş parçacıklarının sonlandırılması gereken çok iş parçacıklı uygulamalar için gereklidir. Aksi halde herkes bayrağı gördüklerinde kapanır. – alexis

+0

Bir sinyalin, sinyal işlendikten sonra işlem devam ederse (küçük) bir bellek sızıntısı yaratacağını unutmayın. Sinyal modülü, nesnesine bir referans tutacak "işleyici" yöntemine bir referans tutacaktır. İşleyiciyi sinyal modülü ile kayıttan çıkarmak isteyebilirsiniz. – Dunes

İlgili konular