簡體   English   中英

生產者/消費者龍卷風隊列是否是線程安全的?

[英]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)

這是add_callback的文檔

除了從信號處理程序之外,隨時可以從任何線程調用此方法是安全的。 請注意,這是IOLoop中唯一可以保證線程安全的方法。 與IOLoop的所有其他交互都必須在該IOLoop的線程中完成。 add_callback()可用於將控制權從其他線程轉移到IOLoop的線程。

如果隊列具有配置的最大大小,則put_nowait可能會引發異常並丟失“ msg”元素。 但是,如果沒有最大大小,則此技術應該適合您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM