2009-08-04 2 views
2

Я пытаюсь понять основные потоки в python, мне трудно понять, как работает объединение с модулем очереди. Heres пример сервера, используемый в том, как я читаю: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/2/. В основном то, что я не понимаю, как переменная pickledList заканчивается доступны рамки нитей, которые будут отправлены к клиенту, так как его не пропускал к потоку в кодеможет кто-то помочь мне понять этот короткий .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()) 

ответ

-2

Темы не имеют собственного пространства имен. pickledList определяется как глобальный, поэтому он доступен для объекта. Технически он должен был иметь global pickledList в верхней части функции, чтобы сделать это ясно, но это не всегда необходимо.

EDIT

По сделать это понятно, я имею в виду "дать понять, к человека."

+0

Будет ли он работать таким же образом, если объявлен pickledList после объявления класса в списке? – Ryan

+0

Простите, Кристофер, что вы говорите о «глобальном», к сожалению, неверно. Глобальная область уровня модуля является частью регулярной поисковой цепочки в Python, без необходимости использования глобального ключевого слова. Вы должны использовать ключевое слово global только в том случае, если вы хотите «переустановить» переменную на новый объект, т. Е. Если вы хотите использовать для нее оператор присваивания. – krawyoti

+0

@krawyoti: Обратите внимание, что я сказал «чтобы было ясно». Я знаю, что это не синтаксически необходимо. – Christopher

Смежные вопросы