【问题标题】:socket threading.Thread args takes exactly 1 argument (2 given)socket threading.Thread args 只需要 1 个参数(给定 2 个)
【发布时间】:2017-11-03 06:28:33
【问题描述】:
import threading
import socket

sock = socket.socket()
sock.bind(('0.0.0.0', 9999))
sock.listen(5)

def handle_client(sock_client):
        data = sock_client.recv(4096)
        while data:
                sock_client.send("this is server: " + data)
                data = sock_client.recv(4096)
        sock_client.close()

while True:
        client = sock.accept()
        t = threading.Thread(target=handle_client, args=client)
        t.start()

TypeError:handle_client() 只接受 1 个参数(给定 2 个)

这个为什么,我的线程args只给一个参数,为什么告诉我给两个参数。

如何理解?

【问题讨论】:

    标签: python multithreading args


    【解决方案1】:

    您以错误的方式调用线程函数。目前,你使用这个:

    t = threading.Thread(target=handle_client, args=client)
    

    但是,你应该使用这个:

    t = threading.Thread(target=handle_client, args=(client, ))
    

    如果您阅读docs,您会发现args 参数应该是一个元组,而不是单个变量。

    更新:

    刚刚测试了我的代码,它工作正常。是的,程序还是会报错(AttributeError: 'tuple' object has no attribute 'recv'),但这是因为你应该使用sock_client[0]来接收数据(sock_client本身就是一个由连接对象和地址组成的元组)。

    所以,正确的代码在这里:

    import threading
    import socket
    
    sock = socket.socket()
    sock.bind(('0.0.0.0', 9999))
    sock.listen(5)
    
    def handle_client(sock_client):
            conn = sock_client[0]
            address = sock_client[1]
            data = conn.recv(4096)
            while data:
                    conn.send("this is server: " + data)
                    data = conn.recv(4096)
            conn.close()
    
    while True:
            client = sock.accept()
            t = threading.Thread(target=handle_client, args=(client, ))
            t.start()
    

    【讨论】:

    • 但是最终的结果是一样的,当只有一个参数,而不是一个元组时,它会被转换成一个元组。 -> /root/s.py(10)handle_client() -> sock_client = args[0] (Pdb) p args ((, ('172.16.0.48', 49524)),)
    • “效果一样”是什么意思?您是否再次收到相同的错误?
    • 不是这样的,原来是client = sock.accpet()返回一个元组,应该是client,addr = sock.accept(),所以没有问题,主要问题是accept() 返回我不清楚的值。
    • 应该是?我在您的代码中没有看到该部分。您是否尝试过调试代码?
    • 您遇到的具体问题是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2017-09-15
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2012-03-07
    相关资源
    最近更新 更多