线程python之间的数据交换

时间:2017-04-11 03:07:08

标签: python multithreading queue

我目前有这段代码:

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具有相同的值。 我尝试使用队列模块,但我无法弄明白。 提前谢谢!

1 个答案:

答案 0 :(得分:2)

您需要在客户端线程(函数x_player1)之外移动x_player2threaded_client。您可以将它们放在一个对象中,然后将其传递给所有工作线程。您将以与现在传递变量conn相同的方式执行此操作,但您不能提供执行此操作的函数start_new_thread

现在每个线程都可以访问相同的两个变量x_player1x_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:循环。所以它永远不会实际循环,这可能不是你想要的。