2010-11-10 16 views
2
import threading 
import mynetworking 

def FirstNIC(): 

    for addr in mynetworking.first.scan(): 
     print addr 

def SecondNIC(): 

    for addr in mynetworking.second.scan(): 
     print addr 

first = threading.Thread(target=FirstNIC) 
second = threading.Thread(target=SecondNIC) 

first.start() 
second.start() 

C'est la structure de code de base que j'ai l'intention de vous. Le programme exécute deux boucles while True pour lire les données provenant de deux sources réseau différentes. Le script ci-dessus doit collecter ces données et les enregistrer.Mon script doit exécuter deux boucles en même temps pour lire les données d'E/S provenant de deux sources différentes. Mon filetage est-il correct?

Ce code fonctionnera-t-il? Est-il bon? Les threads doivent-ils renvoyer le addr pour que le programme principal se connecte? Ou devrais-je simplement remplacer print addr par log(addr)?

Ceci est ma première fois avec multithreading donc je ne suis pas tout à fait sûr comment cela fonctionne ...

+0

La méthode de balayage reviendra-t-elle ou est-elle un générateur (utilise le rendement)? –

+0

Donne le résultat de l'analyse – dave

Répondre

1

Votre code est bien sauf que vos statments d'impression peuvent entrer en collision parce qu'ils ne pouvaient à la fois écrire à la fois. Utilisez Queue.queue pour une synchronisation facile:

import threading 
import mynetworking 
import Queue 

def FirstNIC(queue): 
    for addr in mynetworking.first.scan(queue): 
     queue.put(addr) 

def SecondNIC(queue): 
    for addr in mynetworking.second.scan(): 
     queue.put(addr) 

def logger(queue): 
    while True: 
     print queue.get() 

output_queue = Queue.queue() 
first = threading.Thread(target=FirstNIC, args=(output_queue,)) 
second = threading.Thread(target=SecondNIC, args=(output_queue,)) 

first.start() 
second.start() 

logger(output_queue) 
+0

Je vais lire la file d'attente maintenant. Merci. Une dernière chose, j'ai lu que les threads ne gèrent pas correctement les exceptions KeyboardInterrupt. Comment pourrais-je nettoyer, quitter ce programme? – dave

+0

voir Threading.Thread.daemon. Si vous définissez daemon sur True sur vos threads, ils se termineront lorsque le thread principal sera fermé. Dans la fonction de journalisation, vous pouvez appeler 'queue.empty()', de sorte que vous ne finissez pas de bloquer pour toujours 'queue.get()'. Ensuite, vous pouvez vérifier les conditions de sortie. Ou vous pouvez placer l'enregistreur dans son propre thread (en prenant soin de définir daemon = True) et vérifier les conditions de sortie dans le thread principal. –