在Python中,如何从另一个线程下拉出套接字?
我正在用Python3编写一个简单的多线程聊天服务器。有时我想中断另一个正在等待的线程,以允许theread执行清理任务在Python中,如何从另一个线程下拉出套接字?,python,multithreading,python-3.x,sockets,thread-safety,Python,Multithreading,Python 3.x,Sockets,Thread Safety,我正在用Python3编写一个简单的多线程聊天服务器。有时我想中断另一个正在等待的线程,以允许theread执行清理任务 从另一个线程调用是安全的吗?调用套接字。从另一个线程关闭是相当安全的,并且正如@kinokikuf所提到的,是终止另一个线程中的阻塞recv()的适当方法,只要您能够保证调用shutdown()时套接字尚未关闭即可发生了 如果您不能保证套接字尚未关闭,那么在调用shutdown时可能会出现异常,或者如果出现争用情况并且套接字句柄被操作系统重用,您甚至可能会终止另一个不相关的连
从另一个线程调用是安全的吗?调用
套接字。从另一个线程关闭是相当安全的,并且正如@kinokikuf所提到的,是终止另一个线程中的阻塞recv()
的适当方法,只要您能够保证调用shutdown()时套接字尚未关闭即可
发生了
如果您不能保证套接字尚未关闭,那么在调用shutdown时可能会出现异常,或者如果出现争用情况并且套接字句柄被操作系统重用,您甚至可能会终止另一个不相关的连接
shutdown()
系统调用的没有明确说明阻塞recv()调用将被终止,只是“将不允许进一步的接收和传输”。但实际上,这似乎包括在Unixoid系统和Windows上阻止对同一套接字的recv()
调用
另一种方法是绕过不确定阻塞问题,并定期检查(例如,使用全局变量)线程内部是否应该关闭连接
中断recv()
的另一个合理方法是向线程发送非致命信号,这将中断recv()系统调用,但Python中的低级pthread\u kill
函数似乎没有包装器,因为Python 3.5,这使得此选项无法使用。您可能需要查看,然后可以收听多个输入,并选择任何一个可以为您提供数据的输入。@TemporalWolf我知道选择器。不幸的是,这是一个家庭作业,我们必须使用多线程原始套接字。这似乎表明这实际上是推荐的方法,但我不确定它在诸如PythonI之类的高级语言中是如何工作的,我会鼓励您复习。让我们看看你做了什么/尝试了什么。谢谢!我只从管理函数的线程调用close(),所以我总是关闭一个打开的套接字。