我目前有这段代码:
def threaded_client(conn):
x_player1 = 120
x_player2 = 560
a = 5
b = 5
data = {}
while True:
data = conn.recv(1024)
z = data.decode('utf8')
if z == '1':
x_player1 = (x_player1 - a)
print("client1Left")
elif z == '2':
x_player1 = (x_player1 + b)
print("client1Right")
elif z == '3':
x_player2 -= c
print("client2Left")
elif z == '4':
x_player2 += d
print("client2Right")
data["player"] = {"x_player1": x_player1,
"x_player2" : x_player2
}
s=json.dumps(data)
return s
while True:
conn, addr = server.accept()
start_new_thread(threaded_client,(conn,))
当客户端连接程序时,它会创建一个新线程。唯一的问题是我希望两个线程对x_player1和x_player2具有相同的值。 我尝试使用队列模块,但我无法弄明白。 提前谢谢!
答案 0 :(得分:2)
您需要在客户端线程(函数x_player1
)之外移动x_player2
和threaded_client
。您可以将它们放在一个对象中,然后将其传递给所有工作线程。您将以与现在传递变量conn
相同的方式执行此操作,但您不能提供执行此操作的函数start_new_thread
。
现在每个线程都可以访问相同的两个变量x_player1
和x_player2
。但是你必须要小心,两个线程不会同时试图弄乱它们。每当您需要修改它们时,您必须以线程安全的方式执行此操作。为此,您可以使用Lock,您可以在同一个类中创建。我在递增x_player1
时给出了一个使用此锁的示例。我使用上下文管理器来获取并释放锁。
class Players:
def __init__(self):
self.x_player1 = 120
self.x_player2 = 500
self.lock = threading.Lock() # RLock is often better
def increment_p1(self, n):
with self.lock:
self.x_player1 += n
# similarly for decrement_p1, increment_p2, decrement_p2
我会指出你的程序至少有一个严重的问题。你有一个总是执行返回的while True:
循环。所以它永远不会实际循环,这可能不是你想要的。