2024-04-25 23:56:23 发布
网友
我正在用Python3编写一个简单的多线程聊天服务器。有时我想中断另一个正在等待socket.recv()的线程,以允许该线程执行清理任务。在
从另一个线程安全地调用socket.shutdown(socket.SHUT_RDWR)?在
从另一个线程调用socket.shutdown是相当安全的,而且,正如@kinokikuf所提到的,是在另一个线程中终止阻塞recv()的适当方法,只要您能够保证调用shutdown()时套接字尚未关闭。在
socket.shutdown
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使该选项不可用。在
pthread_kill
从另一个线程调用
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使该选项不可用。在相关问题 更多 >
编程相关推荐