2012-02-15 61 views
0

我正在使用IntNReceiver协议来处理TCP客户端服务器应用程序。服务器正在接受来自客户端的多个TCP连接。我想让其他线程在客户端和服务器上使用协议的sendString方法。我尝试使用同步队列,在单独的线程中监视,reactor.callFromThread()从那里调用sendString。这似乎工作,但实际sendString实际发送字符串之前大约20秒有一个奇怪的延迟。它不会阻止,立即返回。我跑strace和send()系统调用肯定是延迟。用扭曲做这种事情的正确方法是什么?如何确保协议的发送方法是线程安全的

回答

1

直接使用callFromThread作为您的队列。反应堆已经在进行同步和监测。无论您想从非反应器线程拨打foo.sendString(),只需执行reactor.callFromThread(foo.sendString)即可。建立额外的基础设施来做到这一点(例如,您自己的自定义同步队列)只是可能会破坏的其他代码 - 正如您已经发现的那样。

+0

谢谢,这绝对是要走的路。另外,我调用'reactor.callFromThread(foo.sendString)'的线程是使用常规的Python线程API创建的。我切换到'reactor.callInThread',而现在一切正常。这是否意味着'callFromThread'只有在由'callInThread'或'deferToThread'创建的线程调用时才确保线程安全?或者在稍微清理一下之后,我修复了一些导致这个问题的东西...;) – 2012-02-15 22:51:26

+0

'callFromThread'应该可以在任何Python线程中正常工作,而不仅仅是由'callInThread'创建的那些线程(或者实际上由任何与Twisted )。 – Glyph 2012-02-16 13:21:54