Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何确保协议的发送方法是线程安全的_Python_Twisted - Fatal编程技术网

Python 如何确保协议的发送方法是线程安全的

Python 如何确保协议的发送方法是线程安全的,python,twisted,Python,Twisted,我正在使用IntNReceiver协议开发TCP客户机-服务器应用程序。服务器正在接受来自客户端的多个TCP连接。我想让其他线程在客户端和服务器上都使用协议的sendString方法。我尝试使用同步队列,在单独的线程和reactor.callFromThread()中进行监视,从那里调用sendString。这似乎是可行的,但是在实际的sendString实际发送字符串之前有一个奇怪的延迟,大约20秒。它不会阻塞,会立即返回。我运行了strace,send()系统调用肯定被延迟了。使用twist

我正在使用IntNReceiver协议开发TCP客户机-服务器应用程序。服务器正在接受来自客户端的多个TCP连接。我想让其他线程在客户端和服务器上都使用协议的sendString方法。我尝试使用同步队列,在单独的线程和reactor.callFromThread()中进行监视,从那里调用sendString。这似乎是可行的,但是在实际的sendString实际发送字符串之前有一个奇怪的延迟,大约20秒。它不会阻塞,会立即返回。我运行了strace,send()系统调用肯定被延迟了。使用twisted执行此类操作的正确方法是什么?

直接使用
callFromThread
作为队列即可。反应堆已经开始同步并监控它。只要执行
reactor.callFromThread(foo.sendString)
即可从非反应器线程调用
foo.sendString()
。构建额外的基础设施(例如,您自己的自定义同步队列)只是额外的代码,可能会中断—正如您已经发现的那样。

谢谢,这绝对是一条正确的道路。此外,调用reactor.callFromThread(foo.sendString)的线程是使用常规Python线程API创建的。我切换到反应堆,改为callInThread,现在一切正常。这是否意味着
callFromThread
仅在从
callInThread
deletothread
创建的线程调用时才保证线程安全?或者,在做了一点清洁之后,我修复了导致此问题的其他问题……;)
callFromThread
应该可以在任何Python线程中正常工作,而不仅仅是那些由
callInThread
创建的线程(或者实际上是由任何与Twisted相关的线程创建的线程)。