单个生产者/消费者Tornado队列是否是线程安全的?

时间:2015-10-13 14:22:42

标签: python tornado

龙卷风几乎没有线程安全。这是有充分理由的。

特别是Threadsafe队列会产生不必要的费用。但是,队列的线程安全性可能意味着各种各样的事情,常见的用途意味着困难的多生产者,多消费者案例。

然而,一个更简单的案例是单一生产者,单一消费者案例。 Tornado可以安全地进行以下一对操作吗?

# on event loop in Thread 1
yield queue.get()  

# In normal code in Thread 2
queue.put_nowait(msg)  

1 个答案:

答案 0 :(得分:2)

不,Tornado队列的任何定义都不是线程安全的。考虑从“线程2”调度主线程上的“put_nowait”调用:

action

Here is the doc for add_callback

  

除了信号处理程序之外,可以随时从任何线程调用此方法。请注意,这是IOLoop中唯一可以保证线程安全的方法;与IOLoop的所有其他交互必须从I​​OLoop的线程完成。 add_callback()可用于将控制权从其他线程转移到IOLoop的线程。

如果队列配置了最大大小,则put_nowait可能引发异常并丢失“msg”元素。但是如果没有最大尺寸,这种技术应该适合你。