socket threading.Thread args只需1个参数(给定2个)

时间:2017-11-03 06:28:34

标签: python multithreading args

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只给出一个参数,为什么告诉我给出两个参数。

如何理解这一点?

1 个答案:

答案 0 :(得分: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()