为什么在向服务器发送消息时python多线程在套接字中不起作用?

时间:2018-11-23 16:40:24

标签: python multithreading sockets web-crawler

我正在尝试通过python捕获项目符号屏幕。其过程是在将登录名和其他一些消息发送到项目符号屏幕服务器后,我将得到响应。

当我计划获取两个房间的项目符号屏幕时,我只能得到第一个请求的响应。

代码如下:

# coding=utf-8

import multiprocessing
import socket
import time
import re
import signal
import threading



client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname("openbarrage.douyutv.com")
port = 8601
client.connect((host, port))

def send_req_msg(msg):
    """
    wrap msg
    """
    pass

def set_msg(roomid):
    msg = 'type@=loginreq/roomid@={}/\0'.format(roomid)
    send_req_msg(msg)

    msg_more = 'type@=joingroup/rid@={}/gid@=-9999/\0'.format(roomid)
    send_req_msg(msg_more)



if __name__ == '__main__':
    pool = []
    roomid = [123, 666]
    for i in range(0, len(roomid)):
        t = threading.Thread(target=set_msg(roomid[i]))
        t.start()
        pool.append(t)
    for a in pool:
        a.join()

多处理和线程均无法成功。当我使用wireshard分析tcp时。只有第一个请求,它是响应。而且我只能得到房间屏幕上的项目符号123。那么为什么第二个线程/处理不起作用?那我该怎么办?谢谢。

1 个答案:

答案 0 :(得分:2)

t = threading.Thread(target=set_msg(roomid[i]))

这不会将函数set_msg()传递给线程。它调用函数并将结果传递给线程(在这种情况下,传递的值始终为None,因为set_msg()不会返回任何值)。如果在创建线程之前调用该函数,则该函数将不会在线程中运行。您需要将函数(及其参数)传递给Thread构造函数而不调用它:

t = threading.Thread(target=set_msg, args=(roomid[i],))