次のコードでは、スレッドによってpickledList
が使用されており、グローバルスコープに設定されていることがわかります。グローバルスコープの変数:スレッドによってピックアップされる前にその値が変更できますか?
スレッドが使用していた変数が最終的なwhileループの下のどこかに動的に設定されていた場合、スレッドが使用する前にその値が変更される可能性がありますか?ループに値を動的に設定してスレッドに送信し、スレッドが使用する前に値が変更されていないことを確認しますか?
import pickle
import Queue
import socket
import threading
someList = [ 1, 2, 7, 9, 0 ]
pickledList = pickle.dumps (someList)
class ClientThread (threading.Thread):
def run (self):
while True:
client = clientPool.get()
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 ]
clientPool = Queue.Queue (0)
for x in xrange (2):
ClientThread().start()
server = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
server.bind (('', 2727))
server.listen (5)
while True:
clientPool.put (server.accept())
編集:ここでは
は私の問題のより良い例です。
from threading import Thread
class t (Thread):
def run(self):
print "(from thread) ",
print i
for i in range(1, 50):
print i
t().start()
がどのように私はそのはもはやにバインドされたような方法でスレッドにi
に値を渡すことができます:あなたはこれを実行すると、時々、値がいくつかがスキップさせる、スレッドを出力することができる彼らの前に変更しますこの変数は、i
に格納されている値が変更された場合、スレッドが処理している値には影響しません。
これらは、同じソースリストを参照する全く異なる質問です。最初の質問で私はスコープを理解していませんでした。この質問では、スレッドに渡される変数のデータを保護する方法を理解していません。 – Ryan
"スレッド内で値を動的に設定してスレッドに送信し、スレッドが使用する前にその値が変更されないことを確認するにはどうすればよいですか? それはどういう意味ですか?値はスレッドがアクセスした後でなければ変更できませんか? – wbg
のいずれか、またはスレッドに値を送信する必要があります。新しいスコープで終了し、元の値を変更するとスレッドが使用している値に影響しません。 – Ryan