【发布时间】:2009-08-04 16:49:40
【问题描述】:
在下面的代码中,您看到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 中存储的值发生变化,则线程正在使用的值不是受影响。
【问题讨论】:
-
它们是完全不同的问题,引用相同的源列表。在第一个问题中,我不了解范围。在这个问题中,我不明白如何保护传递给线程的变量中的数据。
-
“我怎样才能在那个循环中动态设置一个值,将它发送到线程并确保它的值在线程开始使用它之前不会改变?”这意味着什么?在线程访问它之前,该值不能改变?
-
要么,要么我需要将值发送到线程,使其最终处于一个新范围内,在该范围内更改原始值不会影响线程正在使用的值
-
这不是很清楚。如果线程不应该使用它,为什么还要向它发送一个新值?
-
问题是在我正在查看的示例中,该值从未发送到线程。线程正在使用全局范围内的变量。我的问题是,如果我调用一个线程以使用存储在该变量中的值,但值在线程有机会使用它之前发生了变化,该怎么办。我的问题是,我将如何以改变初始变量中的值不会影响线程正在使用的值的方式将该变量中的值传递给线程。
标签: python multithreading scope