2009-08-04 7 views
2

私はPythonでの基本的なスレッドを理解しようとしていますが、キューモジュールでのプールの仕組みを理解できません。私が読んでいるハウツーに使用されているサンプルサーバをご紹介します: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()) 

答えて

4

pickledList変数は、として利用可能であるそのどこかのコードでスレッドに渡されたことがないので、クライアントに出荷されるまでスレッドのスコープで使用可能な終了方法を基本的に私は理解していないことですClientThreadクラスのグローバル変数です。 Short Description of Python Scoping Rulesを参照してください。

-2

スレッドには独自の名前空間がありません。 pickledListはグローバルとして定義されているため、オブジェクトにアクセスできます。技術的には、それを明確にするために関数の先頭にglobal pickledListがあったはずですが、必ずしも必要というわけではありません。それを明確にすることで

EDIT

、私は "人間にそれを明確にする。" を意味します

+0

リストが宣言された後にpickledListが宣言された場合と同じように動作しますか? – Ryan

+0

申し訳ありませんクリストファー、「グローバル」についてあなたが言っていることは、残念ながら間違っています。モジュールレベルのグローバルスコープは、グローバルキーワードを使用する必要がなく、Pythonの通常のルックアップチェーンの一部です。変数を新しいオブジェクトに「リバインド」したい場合、つまり、そのオブジェクトに対してassignement文を使用する場合にのみ、globalキーワードを使用する必要があります。 – krawyoti

+0

@krawyoti:私は「明らかにする」と言ったことに注意してください。私はそれが構文的に必要でないことを知っています。 – Christopher

関連する問題