2009-08-04 8 views
2

J'essaie de comprendre le threading de base en python, j'ai du mal à comprendre comment fonctionne la mise en pool avec le module de file d'attente. Heres l'exemple de serveur utilisé dans le howto que je suis en train de lire: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/2/. Fondamentalement, ce que je ne comprends pas comment la pickledList variables finit à la disposition du fils portée à être expédiés au client depuis son jamais passées à la fil partout dans le codequelqu'un peut m'aider à comprendre ce court .py

import pickle 
import Queue 
import socket 
import threading 

# We'll pickle a list of numbers, yet again: 
someList = [ 1, 2, 7, 9, 0 ] 
pickledList = pickle.dumps (someList) 

# A revised version of our thread class: 
class ClientThread (threading.Thread): 

    # Note that we do not override Thread's __init__ method. 
    # The Queue module makes this not necessary. 

    def run (self): 

     # Have our thread serve "forever": 
     while True: 

     # Get a client out of the queue 
     client = clientPool.get() 

     # Check if we actually have an actual client in the client variable: 
     if client != None: 

      print 'Received connection:', client [ 1 ] [ 0 ] 
      client [ 0 ].send (pickledList) 
      for x in xrange (10): 
       print client [ 0 ].recv (1024) 
      client [ 0 ].close() 
      print 'Closed connection:', client [ 1 ] [ 0 ] 

# Create our Queue: 
clientPool = Queue.Queue (0) 

# Start two threads: 
for x in xrange (2): 
    ClientThread().start() 

# Set up the server: 
server = socket.socket (socket.AF_INET, socket.SOCK_STREAM) 
server.bind (('', 2727)) 
server.listen (5) 

# Have the server serve "forever": 
while True: 
    clientPool.put (server.accept()) 

Répondre

-2

Les threads n'ont pas leur propre espace de noms. pickledList est défini comme global, il est donc accessible à l'objet. Techniquement, il aurait dû avoir un global pickledList en haut de la fonction pour le rendre clair, mais ce n'est pas toujours nécessaire.

EDIT

En fait clairement, je veux dire "faire comprendre à un humain ."

+0

Est-ce que ça marcherait de la même façon si pickledList était déclaré après que la classe ait été déclarée dans la liste? – Ryan

+0

Désolé Christopher, ce que vous dites sur le "global" est malheureusement faux. La portée globale au niveau du module fait partie de la chaîne de recherche régulière dans Python, sans avoir besoin d'utiliser le mot-clé global. Vous devez utiliser le mot clé global uniquement si vous souhaitez "relier" la variable à un nouvel objet, c'est-à-dire si vous souhaitez utiliser l'instruction d'affectation. – krawyoti

+0

@krawyoti: Notez que j'ai dit "pour le rendre clair". Je sais que ce n'est pas syntaxiquement nécessaire. – Christopher

Questions connexes