может кто-нибудь помочь мне понять этот короткий .py - PullRequest
2 голосов
/ 04 августа 2009

Я пытаюсь понять основные потоки в Python, у меня возникают проблемы с пониманием того, как пул работает с модулем очереди. Вот пример сервера, использованного в руководстве, из которого я читаю: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/2/. По сути, я не понимаю, как переменная pickledList становится доступной для области потоков, которая будет отправлена ​​клиенту, так как она никогда не передавалась в теме где-нибудь в коде

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 ]

4 голосов
/ 04 августа 2009

Переменная pickledList доступна как глобальная переменная в классе ClientThread. См. Краткое описание правил Python Scoping .

0 голосов
/ 04 августа 2009

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

EDIT

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...