Python 如何确保协议的发送方法是线程安全的
我正在使用IntNReceiver协议开发TCP客户机-服务器应用程序。服务器正在接受来自客户端的多个TCP连接。我想让其他线程在客户端和服务器上都使用协议的sendString方法。我尝试使用同步队列,在单独的线程和reactor.callFromThread()中进行监视,从那里调用sendString。这似乎是可行的,但是在实际的sendString实际发送字符串之前有一个奇怪的延迟,大约20秒。它不会阻塞,会立即返回。我运行了strace,send()系统调用肯定被延迟了。使用twisted执行此类操作的正确方法是什么?直接使用Python 如何确保协议的发送方法是线程安全的,python,twisted,Python,Twisted,我正在使用IntNReceiver协议开发TCP客户机-服务器应用程序。服务器正在接受来自客户端的多个TCP连接。我想让其他线程在客户端和服务器上都使用协议的sendString方法。我尝试使用同步队列,在单独的线程和reactor.callFromThread()中进行监视,从那里调用sendString。这似乎是可行的,但是在实际的sendString实际发送字符串之前有一个奇怪的延迟,大约20秒。它不会阻塞,会立即返回。我运行了strace,send()系统调用肯定被延迟了。使用twist
callFromThread
作为队列即可。反应堆已经开始同步并监控它。只要执行reactor.callFromThread(foo.sendString)
即可从非反应器线程调用foo.sendString()
。构建额外的基础设施(例如,您自己的自定义同步队列)只是额外的代码,可能会中断—正如您已经发现的那样。谢谢,这绝对是一条正确的道路。此外,调用reactor.callFromThread(foo.sendString)的线程是使用常规Python线程API创建的。我切换到反应堆,改为callInThread,现在一切正常。这是否意味着callFromThread
仅在从callInThread
或deletothread
创建的线程调用时才保证线程安全?或者,在做了一点清洁之后,我修复了导致此问题的其他问题……;)callFromThread
应该可以在任何Python线程中正常工作,而不仅仅是那些由callInThread
创建的线程(或者实际上是由任何与Twisted相关的线程创建的线程)。