龙卷风几乎没有线程安全。这是有充分理由的。
特别是Threadsafe队列会产生不必要的费用。但是,队列的线程安全性可能意味着各种各样的事情,常见的用途意味着困难的多生产者,多消费者案例。
然而,一个更简单的案例是单一生产者,单一消费者案例。 Tornado可以安全地进行以下一对操作吗?
# on event loop in Thread 1
yield queue.get()
# In normal code in Thread 2
queue.put_nowait(msg)
答案 0 :(得分:2)
不,Tornado队列的任何定义都不是线程安全的。考虑从“线程2”调度主线程上的“put_nowait”调用:
action
Here is the doc for add_callback:
除了信号处理程序之外,可以随时从任何线程调用此方法。请注意,这是IOLoop中唯一可以保证线程安全的方法;与IOLoop的所有其他交互必须从IOLoop的线程完成。 add_callback()可用于将控制权从其他线程转移到IOLoop的线程。
如果队列配置了最大大小,则put_nowait可能引发异常并丢失“msg”元素。但是如果没有最大尺寸,这种技术应该适合你。