2009-02-09 18 views
0

Je veux que mon application boucle en python mais ait un moyen de quitter. Existe-t-il un moyen d'obtenir des entrées à partir de la console, de le scanner pour la lettre q et rapide lorsque mon application est prête à quitter? en C je voudrais juste créer un pthread qui attend cin, scans, verrouille un var global, changer, déverrouiller et quitter le thread permettant à mon application de quitter quand il est fait dumping un fichier ou w/e il fait. Est-ce que je fais cela de la même manière en python et sera-t-il cross-plateforme? (Je vois une seule instance globale en python qui était spécifique à Windows)console Python intrus? et les threads multiplateformes

Répondre

1

Utilisez le module de threading pour créer une classe de thread.

import threading; 

class foo(threading.Thread): 
    def __init__(self): 
     #initialize anything 
    def run(self): 
     while True: 
      str = raw_input("input something"); 

class bar: 
    def __init__(self) 
     self.thread = foo(); #initialize the thread (foo) class and store 
     self.thread.start(); #this command will start the loop in the new thread (the run method) 
     if(quit): 
      #quit 
1

Créer un nouveau fil est assez facile - le module de filetage vous aidera. Vous pouvez vouloir le rendre démoniaque (si vous avez d'autres moyens de quitter votre programme). I pense vous pouvez changer une variable sans verrouillage, aussi - python implémente ses propres threads, et je suis assez sûr que quelque chose comme self.running = False sera atomique.

La façon la plus simple pour lancer un nouveau thread est avec threading.Thread(target=):

# inside your class definition 
def signal_done(self): 
    self.done = True 

def watcher(self): 
    while True: 
     if q_typed_in_console(): 
      self.signal_done() 
      return 

def start_watcher(self): 
    t = threading.Thread(target=self.watcher) 
    t.setDaemon(True) # Optional; means thread will exit when main thread does 
    t.start() 

def main(self): 
    while not self.done: 
     # etc. 

Si vous voulez que votre fil pour être plus intelligent, avoir son propre état, etc., vous pouvez sous-classe threading.Thread vous. Les docs en ont plus.

[lié à ceci: l'exécutable python lui-même est mono-thread, même si vous avez plusieurs threads python]