【问题标题】:Multithreaded client in pythonpython中的多线程客户端
【发布时间】:2017-12-15 11:28:37
【问题描述】:

当我连接到服务器时遇到问题,它连接正确并且线程中的代码运行完美,问题是它看起来好像我没有收到任何消息,或者至少 self.data没有更新,我尝试使用 print("") 进行检查,似乎代码没有到达我启动线程后的 while 循环。这是我的代码:

class Client:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def __init__(self, address):
        self.sock.connect((address, 10000))
        self.playerID = PID
        self.data = [0, 0, 0, 0, 0]


        iThread = threading.Thread(target=self.game(self.data))
        iThread.daemon = True
        iThread.start()

        while True:
            data = self.sock.recv(2048)
            datas = pickle.loads(data)
            for i in range(0, len(self.data)):
                self.data[i]= datas[i]
            if not data:
                break

    def game(self, data):
        morecode...

【问题讨论】:

  • game 有什么回报吗?
  • 嗨,不,它只向服务器发送消息并更新列表
  • 在创建Thread 时,您似乎在调用self.game(self.data),而不是让线程调用它。
  • 我应该如何让线程调用我的游戏函数?
  • 你有没有环顾四周,看到任何使用带参数的目标创建线程的示例?

标签: python multithreading python-3.x networking python-3.6


【解决方案1】:

这是一个实验,其中Thread 被赋予不带参数的目标,但目标已经关闭了它需要的参数:

from threading import Thread

import time

def func1(data):
    time.sleep(2)
    data.append(2)


def func(data):

    def func2():
        func1(data)

    print(data)
    t=Thread(target=func2)
    t.start()
    t.join()
    print(data)
    t=Thread(target=lambda: func1(data))
    t.start()
    t.join()
    print(data)


func([0])

输出:

[0]
[0, 2]
[0, 2, 2]

这个答案是为了表明有办法给Thread一个目标,这是一种闭包形式。

【讨论】:

  • 我还没有工作,谢谢,我按照你的建议检查了如何使用带有和参数的线程,它显示参数是一个元组,所以我必须在其中指定参数元组,像这样:iThread = threading.Thread(target=self.game, args=(self.data,))
猜你喜欢
  • 2011-07-29
  • 2010-11-25
  • 2021-12-01
  • 2021-05-02
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
相关资源
最近更新 更多