如何解除阻止的套接字?

2024-10-02 12:31:15 发布

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

简介: 我的程序偶尔会遇到这样的情况:它想通过一个套接字发送数据,但该套接字被阻塞,等待对以前从未出现的命令的响应。有没有什么方法可以在这种情况下解除对套接字的阻塞并重新使用它?如果不是这样,我怎么能测试插座是否被阻塞,这样我就可以关闭它并打开一个新的?(我首先需要阻塞插座)

详细信息: 我通过两个插座连接到服务器。插座1用于总指挥通信。套接字2用于中止正在运行的命令。流产随时都有可能发生。通过套接字1发送的每个命令都会得到一个响应,例如:

socket1 send: set command data
socket1 read: set command ack

在发送和读取之间总是有一段时间,因为服务器在命令执行完成之前不会发送任何内容。在

为了中断正在进行的命令,我通过另一个套接字连接并发出一个abort命令。然后我使用socket1发出一个新命令。在

我发现,偶尔在中止后通过套接字1发出的命令会挂起程序。套接字1似乎被阻塞,等待对以前发出的命令的响应,该命令从未返回(并且被中断)。虽然它通常是有效的,但有时不起作用(我没有编写服务器)。在

在这些情况下,有没有办法让我检查一下套接字1在等待读取时是否被阻塞,如果是,则放弃该读取并继续执行?或者任何检查的方法,这样我就可以关闭插座重新启动了?在

谢谢!在

更新1:谢谢你的回答。至于我为什么使用阻塞套接字,那是因为我用这个代码控制一台数控机床,我需要知道我要求它执行的命令何时执行完毕。完成后,服务器返回ACK,所以这似乎是一个很好的处理方法。我喜欢对非阻塞进行重构的想法,但我无法想象当命令以其他方式完成时,如何获取信息。我来看看select和其他选项。在


Tags: 方法命令程序服务器sendreaddata情况
3条回答

这个问题的传统解决方案是使用select。在编写之前,测试套接字是否支持写入,如果不支持,请执行其他操作(例如先等待响应)。在select之上的一个级别,Python提供了asyncore模块来启用这种处理。上面两层,Twisted是一个处理消息异步处理的完整框架。在

这并不是说让人觉得不舒服,但您说您需要阻塞套接字,然后继续描述需要非阻塞套接字的一些非常好的理由。我建议重构使用非阻塞。在

除此之外,我知道的唯一一个方法是知道一个套接字是否被阻止,就是你的程序调用了recv或它的一个变体,但尚未返回。其他人可能知道一个我不知道的API,但是在recv调用之前设置一个“blocked”布尔值并在之后清除它可能是获得这些信息的最佳方法。但你不想那样做。相信我,从长远来看,重构是值得的。在

插座应为全双工。如果Python阻止一个线程向套接字写入数据,而另一个线程正在从同一个套接字读取数据,那么我认为这是Python中的一个主要错误。这在我用过的任何其他编程语言中都不会发生。在

相关问题 更多 >

    热门问题