[英]Are single producer/consumer Tornado queues thread-safe?
龍卷風幾乎沒有什么是線程安全的。 這有充分的理由。
特別是線程安全隊列將產生不必要的開銷。 但是,隊列的線程安全性可能意味着各種各樣的事情,通常的使用意味着多生產者,多消費者的情況很困難。
但是,單生產者,單消費者的情況要簡單得多。 使用龍卷風進行以下操作安全嗎?
# on event loop in Thread 1
yield queue.get()
# In normal code in Thread 2
queue.put_nowait(msg)
不,根據術語的任何定義,龍卷風隊列都不是線程安全的。 考慮從您的“線程2”在主線程上安排“ put_nowait”調用:
IOLoop.current().add_callback(queue.put_nowait, msg)
除了從信號處理程序之外,隨時可以從任何線程調用此方法是安全的。 請注意,這是IOLoop中唯一可以保證線程安全的方法。 與IOLoop的所有其他交互都必須在該IOLoop的線程中完成。 add_callback()可用於將控制權從其他線程轉移到IOLoop的線程。
如果隊列具有配置的最大大小,則put_nowait可能會引發異常並丟失“ msg”元素。 但是,如果沒有最大大小,則此技術應該適合您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.