gpt4 book ai didi

python - 多线程处理多个传入请求

转载 作者:太空宇宙 更新时间:2023-11-03 16:04:08 24 4
gpt4 key购买 nike

我是Python新手。我必须编写一个监听器/服务器来处理来自同一网络的请求。所以我使用socket。我将从客户端获取请求 json,服务器/监听器将进行处理并返回结果。这就是将要发生的一切。并且服务器和客户端之间不会有来回通信。

代码看起来像这样:

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    
server_address = ('localhost', 10000)
sock.bind(server_address)
sock.listen(1)

while True:
connection, client_address = sock.accept()

while True:
#read request data
#process request
#reply response to **connection** object
break #continue waiting for new request

现在的问题是,在当前请求处理完成之前,服务器不会接受新请求。我必须以某种方式在单独的并发线程中执行处理和发送响应回复。我尝试将处理逻辑封装在扩展 Thread 类的单独类 RequestHandler 中。我将 connection 对象传递给我的自定义类 RequestHandler 的实例。我做了这样的事情:

requestHandler = RequestHandler(deepcopy(connection))
requestHandler.daemon = True
requestHandler.start()

然而,这就是我陷入困境的地方。我可以将相同的 connection 对象传递给每次收到新请求时生成的新实例 RequestHandler 吗?上面代码中的深度复制给了我以下错误:

TypeError: Cannot serialize socket object

我做错了什么?我应该采取一些不同的方法吗?

最佳答案

无需扩展Thread类。最简单的版本是这样的:

import threading

def client_handler(connection):
#read request data
#process request
#reply response to **connection** object

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 10000)
sock.bind(server_address)
sock.listen(1)

while True:
connection, client_address = sock.accept()
threading.Thread(target=client_handler, args=(connection,)).start()

现在,如果您愿意,可以将套接字对象包装到 RequestHandler 类中,这很好。但你不能复制套接字。只需传递一个引用即可:RequestHandler(connection)。为什么还要复制它?

它不可复制的原因是它代表一些系统资源(即套接字)。如果有两个对象指向同一资源,那么它们就会相互冲突。在 C 级别,如果有多个所有者,则同步纯文件描述符(套接字在 C 级别只是数字)是极其困难的。因此套接字对象是底层文件描述符的一种独特的“网关”。

关于python - 多线程处理多个传入请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com