2010-03-19 55 views
4

我試着寫一些一種多協議BOT(嘰裏咕嚕/ IRC),將讀取FIFO文件的消息(一個襯墊大部分),然後將它們發送到irc頻道和jabber聯繫人。到目前爲止,我設法創建了兩個工廠來連接到jabber和irc,並且他們似乎在工作。的Python(雙絞線) - 從FIFO讀,讀出的數據發送給多個協議

但是,我在閱讀fifo文件時遇到問題 - 我不知道如何在反應器循環之外的循環中讀取它(打開文件,讀取行,關閉文件,跳轉到打開文件等),以便獲取我需要發送的數據,然後將這些數據發送到反應器迴路以便在兩種協議中發送。我一直在尋找有關如何以最佳方式做到這一點的信息,但我完全失去了黑暗。任何建議/幫助將不勝感激。

提前致謝!

回答

1

FIFO是問題所在。改爲從套接字讀取。這將更適合Twisted事件驅動模型的信息。試圖在反應堆控制之外做事通常是錯誤的做法。

----更新基於反饋FIFO爲外部約束,無法避免----

OK,中心問題是,你不能在(僅)主線程編寫代碼你的Twisted應用阻止了對fifo的讀取調用。如果沒有可讀的內容,這將導致整個應用程序失速。所以你要麼在不同步讀取fifo,要麼創建一個單獨的線程來讀取它,要麼將應用程序分成兩部分。

最後一個選項是最簡單的 - 修改Twisted應用程序,以便它在一個套接字上偵聽並編寫一個單獨的小型「forwarder」應用程序,該應用程序以簡單的循環運行,讀取fifo並將其聽到的所有內容寫入套接字。

+0

問題是我沒有控制數據的來源。它已經以fifo形式提供,這是我必須與之合作的內容。我可能會問,如果真的沒有其他方式來獲得這些數據,但直到我得到答案,它的fifo。 – SpankMe 2010-03-19 10:44:26

3

您可以讀寫文件描述符,而不會像使用套接字一樣阻塞反應堆,通過套接字不使用文件描述符的方式?

你的情況創建一個類,實現twisted.internet.interfaces.IReadDescriptor並添加到使用twisted.internet.interfaces.IReactorFDSet.addReader反應堆。有關IReadDescriptor實施的示例,請參閱twisted.internet.tcp.Connection

我不能更具體,因爲我從來沒有做過我的自我,但我希望這可能是一個起點。