簡體   English   中英

python絞線INotify無阻塞電抗器

[英]python twisted INotify without blocking reactor

我正在使用 twsited 的 INotify 來監視 /dev 目錄以監視正在添加的新串行設備。 我目前使用的代碼類似於下面。

notifier = INotify()
notifier.watch(FilePath("/dev"), IN_CREATE, callbacks=[self.created])
notifier.startReading()

def created(self, ignored, path, mask):
    ...
    blocking code
    ...

我現在遇到的問題是當“創建”被調用時,它阻塞了我的反應器,所以其他網絡會話(我有 TCP 和 UDP 連接與同一反應器相關聯)必須等待“創建”方法結束。

有誰知道我如何使“創建”方法在后台運行,這樣它就不會阻塞我的反應器?

謝謝,

西蒙

Twisted 中的所有事件處理程序都在“反應器線程”中運行 - UDP、TCP 和 inotify。 他們都希望通過不阻塞來與系統合作。 所以,從這個意義上說,這只是一個關於如何在 Twisted 中編寫好的事件處理程序的問題,而不是特別是關於 inotify 的問題。

有很多選項可以避免阻塞。 回答您的問題的棘手之處在於,正確的選擇取決於當前代碼塊的確切原因。

它做套接字 I/O 嗎? 請改用Twisted 的非阻塞套接字 I/O API。

它是否進行文件系統 I/O? 您可能需要在這里使用一個線程,因為沒有一個非阻塞文件系統 I/O 是困難的(也許並非不可能)。

它是否與 SQL 數據庫通信? 也許twisted.enterprise.adbapi可以提供幫助。

等等。

我不知道這是否涵蓋了您所在的情況。但是,我將強調兩點。 首先,在 Twisted 程序中使用線程是完全合理的。 大部分 Twisted 都存在,因此您不必使用線程,但如果您遇到線程完成工作而沒有其他工作的情況 - go (謹慎;)。 Twisted 甚至還有一些幫手讓它變得更簡單,比如deferToThread提到的 deferToThread。 其次,為任務選擇合適的解決方案。 所有“阻塞”問題的集合僅比所有一般編程問題的集合略小。 有很多可能的解決方案。 有些,如線程,似乎具有廣泛的適用性,但稍加注意,您可能會發現更適合特定情況的東西。

此外,請查看Twisted: Making code non-blocking以獲得進一步的解釋。

您可以使用twisted.internet.threads.deferToThread在線程中運行您的阻塞代碼:

deferToThread(self.created, ignored, path mask)

暫無
暫無

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

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