在Python中如何从另一个线程下拉出套接字?

2024-04-25 23:56:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python3编写一个简单的多线程聊天服务器。有时我想中断另一个正在等待socket.recv()的线程,以允许该线程执行清理任务。在

从另一个线程安全地调用socket.shutdown(socket.SHUT_RDWR)?在


Tags: 服务器socket线程python3shutdownrecvshutrdwr
1条回答
网友
1楼 · 发布于 2024-04-25 23:56:23

从另一个线程调用socket.shutdown是相当安全的,而且,正如@kinokikuf所提到的,是在另一个线程中终止阻塞recv()的适当方法,只要您能够保证调用shutdown()时套接字尚未关闭。在

如果您不能保证套接字尚未关闭,那么在调用shutdown时可能会出现异常,或者,如果出现争用条件,并且套接字句柄被操作系统重用,您甚至可以终止另一个无关的连接!在

shutdown()系统调用的Linux man page没有明确声明阻塞recv()调用将被终止,只是“将不允许进一步的接收和传输”。但实际上,这似乎包括在Unixoid系统和Windows上的同一个套接字上阻塞recv()调用。在

另一种方法是使用socket.settimeout()来避免不确定的阻塞问题,并定期检查(例如使用全局变量)线程内部是否应该关闭连接。在

中断recv()的另一个合理方法是向线程发送一个非致命信号,这将中断recv()系统调用,但在Python中似乎没有底层pthread_kill函数的包装器,因为Python 3.5system calls will be automatically restarted if interrupted使该选项不可用。在

相关问题 更多 >