首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python线程: threading.Thread().start()工作,_thread.start_new_thread()不工作

Python线程: threading.Thread().start()工作,_thread.start_new_thread()不工作
EN

Stack Overflow用户
提问于 2022-03-07 15:26:21
回答 1查看 661关注 0票数 0

我正在尝试实现一个具有多个客户端连接的集中式服务器。应该保持连接正常。

到目前为止,我已经尝试了使用线程的多个客户端,但是当套接字与客户端“繁忙”时,另一个客户端无法在该套接字中连接。

此代码表示服务器脚本:

代码语言:javascript
复制
import socket
import threading

HOST = '127.0.0.1'
PORT = 54321


def request_handler(conn, addr):
    with conn:
        print(conn, addr)

        while True:
            data = conn.recv(1024)
            print(data.decode('utf-8'))

            if not data:
                break

            conn.sendall(data)


def main():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen()

        while True:
            conn, addr = s.accept()
            print('Connected with', addr[0], ':', str(addr[1]))

            t = threading.Thread(target=request_handler(conn, addr), daemon=True)
            t.start()


if __name__ == '__main__':
    main()

此代码表示客户端部分:

代码语言:javascript
复制
import socket


host = '127.0.0.1'
port = 54321


def main():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        while True:
            data = input('Type data: ')

            if not data:
                break

            s.send(str.encode(data))

            res = s.recv(1024)
            print('Server Response:', res.decode('utf-8'))


if __name__ == '__main__':
    main()

客户端可以写入许多消息,并且连接保持打开,但是如果我使用另一个客户端,则在第一个客户端关闭连接之前,该客户端无法与服务器连接。

但是我想要的是第二个客户端可以和第一个客户端做同样的事情,以此类推。怎么做?

除了创建多个端口之外,还有其他解决方案吗?

更新

我已经使用_thread.start_new_thread修改了服务器脚本,现在它可以工作了。但我不明白为什么。

改性server.py

代码语言:javascript
复制
import socket
from _thread import start_new_thread

HOST = '127.0.0.1'
PORT = 54321


def request_handler(conn, addr):
    with conn:
        print(conn, addr)

        while True:
            data = conn.recv(1024)
            print(data.decode('utf-8'))

            if not data:
                break

            conn.sendall(data)


def main():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen()

        while True:
            conn, addr = s.accept()
            print('Connected with', addr[0], ':', str(addr[1]))

            start_new_thread(request_handler, (conn, addr))


if __name__ == '__main__':
    main()

总之,使用start_new_thread(request_handler, (conn, addr)),第二个客户端可以连接到服务器,并发送消息;使用threading.Thread(target=request_handler(conn, addr)).start(),它不会连接到服务器,但不会引发错误。

当我使用threading.Thread.start()时,主要步骤是等待#1客户端线程被停止,所以它是透明的,没有启动#2客户端线程;相反,_thread.start_new_thread()工作得很好。但是threading.Thread.start()实现了_thread.start_new_thread,所以这里发生了什么?

EN

回答 1

Stack Overflow用户

发布于 2022-03-08 14:39:41

解决后,我错误地使用了threading.Thread构造函数:

构造函数正在调用request_handler,而不是引用它。

因此,与其:

t= threading.Thread(target=request_handler(conn,addr))

正确的方法是:

t= threading.Thread(target=request_handler,args=(conn,addr))

这样线程就可以并行运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71383380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档