2010-10-12 14 views
5

Je suis actuellement en train d'écrire une application de serveur client comme un exercice et j'ai presque tout pour travailler jusqu'à présent, mais il y a un obstacle mental que je n'ai pas pu google moi-même avec succès.Python Threading Concept Question

Dans l'application serveur, ai-je raison de penser que le threading du gestionnaire de paquets et du gestionnaire de base de données pour fonctionner à partir d'une pile est la bonne chose à faire? L'idée est qu'un thread boucle l'écoute des paquets et ajoute les données à une pile, puis l'autre thread extrait les données au bas de la pile et effectue des vérifications sur un db SQL.

Dans ce cas particulier, il est plus important que le gestionnaire de paquets continue de fonctionner. Je suppose que ma question est, est-ce une utilisation appropriée des threads et où vais-je rencontrer des problèmes qui nécessitent le verrouillage des threads, par exemple, devrais-je verrouiller le gestionnaire db quand le thread paquet ajoute à la pile écrire et lire dire, la seule valeur dans la pile, etc

Merci à tous!

Voici un extrait du code, attention, c'est en cours alors ne jugez pas, aussi ma première tentative de python (dont je profite plus que perl ou php en ce moment!).

class socketListen(threading.Thread): 
    def run(self): 
     while True: 
      datagram = s.recv('1024') 
      if not datagram: 
       break 
      packetArray = datagram.split(',') 
      if packetArray[0] = '31337': 
       listHandle.put(packetArray) 
     s.close() 

class stackOperations(threading.Thread): 
    def run(self): 
     while True: 
      #pull the last item off the stack and run ops on it 
      #listHandle.getLast is the last item on the queue 
    def 

class listHandle(): 
    def put(shiftData): 
     if not mainStack: 
      mainStack = [] 
     mainStack.insert(0,shiftData) 
    def getLast: 
     return mainStack.pop() 

Répondre

4

Ceci est la raison pour laquelle queues est pour. Remplacez la pile par la file d'attente et non, vous n'aurez pas besoin d'utiliser d'autres méthodes de synchronisation. Incidemment, le multitraitement est meilleur que le threading, car il peut tirer parti des processeurs multicœur/hyperthreaded. Les interfaces sont assez similaires, donc ça vaut la peine de se pencher sur la commutation.

+0

Non c'est parfait! Je dois être tout foiré cependant, ne pas enfiler le multitraitement? Et voulez-vous dire utiliser une file d'attente avec la configuration actuelle que j'ai ici avec les discussions ou passer à un autre module? – Melignus

+0

Threading exécute des processus simultanément, généralement sur le même processeur. Le multitraitement exécute des processus distribuant simultanément le travail entre plusieurs processeurs. Similaire, mais distinct. – jathanism

+0

Gotcha, ouais j'ai trouvé la page docs du module multi-traitement juste maintenant. De bonnes choses et je comprends parfaitement. Je suppose que je pensais qu'il y avait peut-être quelque chose où l'interprète passe des fils aux noyaux s'ils sont présents, mais je suppose que c'est juste un vœu pieux. Un module multitraitement a du sens. Merci pour l'aide des gars et les réponses rapides, vous êtes génial! – Melignus