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

在Python中,如何从另一个线程下拉出套接字?,python,multithreading,python-3.x,sockets,thread-safety,Python,Multithreading,Python 3.x,Sockets,Thread Safety,我正在用Python3编写一个简单的多线程聊天服务器。有时我想中断另一个正在等待的线程,以允许theread执行清理任务 从另一个线程调用是安全的吗?调用套接字。从另一个线程关闭是相当安全的,并且正如@kinokikuf所提到的,是终止另一个线程中的阻塞recv()的适当方法,只要您能够保证调用shutdown()时套接字尚未关闭即可发生了 如果您不能保证套接字尚未关闭,那么在调用shutdown时可能会出现异常,或者如果出现争用情况并且套接字句柄被操作系统重用,您甚至可能会终止另一个不相关的连

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


从另一个线程调用是安全的吗?

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

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

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

另一种方法是绕过不确定阻塞问题,并定期检查(例如,使用全局变量)线程内部是否应该关闭连接


中断
recv()
的另一个合理方法是向线程发送非致命信号,这将中断recv()系统调用,但Python中的低级
pthread\u kill
函数似乎没有包装器,因为Python 3.5,这使得此选项无法使用。

您可能需要查看,然后可以收听多个输入,并选择任何一个可以为您提供数据的输入。@TemporalWolf我知道选择器。不幸的是,这是一个家庭作业,我们必须使用多线程原始套接字。这似乎表明这实际上是推荐的方法,但我不确定它在诸如PythonI之类的高级语言中是如何工作的,我会鼓励您复习。让我们看看你做了什么/尝试了什么。谢谢!我只从管理函数的线程调用close(),所以我总是关闭一个打开的套接字。