2013-02-02 46 views
4

我正在Python3中創建一個應用程序,它將分爲batchgui部分。 Batch負責處理邏輯,gui負責顯示它。高效的Python IPC

哪個inter-process communication (IPC)框架,我應該符合下列要求使用:

  1. 的GUI可以在其他設備比批次(GUI可以在同一設備上運行的智能手機,平板電腦等運行,本地或者通過網絡)。
  2. 批(Python3 IPC庫)應當與在Linux,Mac,Windows中,沒有問題的工作...
  3. 的IPC應支持不同的語言編寫(Python和JavaScript中,...)GUI
  4. 的IPC的性能很重要 - 它應該儘可能地「互動」,但不會丟失信息。
  5. 幾個GUI可以連接到同一批次。

附加的:如果GUI保證會用Python編寫,那麼選擇會是其他嗎?

編輯: 我發現了很多IPC庫,喜歡這裏:Efficient Python to Python IPCActiveMQ or RabbitMQ or ZeroMQ or

到目前爲止,我已經找到了最好看的選項有:

  • 的RabbitMQ
  • zeromq

他們是適當slutions這個問題嗎?如果不是爲什麼?如果有什麼更好的,請告訴我爲什麼。

+0

使用'SocketServer'並通過套接字連接GUI。通過這種方式,你可以確定它可以在任何平臺上運行,甚至可以通過網絡。 – Bakuriu

+2

謝謝。你能否認爲justyfi爲什麼'SocketServer'會比例如'zeromq'或'rabbitmq'更好的選擇? –

回答

6

你提到的三個看起來很合適,並會支持你的要求。我認爲你應該繼續你最舒服和熟悉的事情。

從我個人的經驗來看,我相信ZeroMQ是效率,易用性和互操作性之間的最佳組合。我很容易地將zmq 2.2與Python 2.7集成,所以這將是我個人的最愛。不過,正如我所說,我很確定你不會對所有3個框架出錯。

與此相關的一半:隨着時間的推移需求趨於變化,您可能會決定稍後切換框架,因此封裝對框架的依賴將是一個很好的設計模式。 (例如,具有與框架相互作用並且其API使用您的內部數據結構和域語言的單個導管模塊)

1

的解決方案是dbus

這是一個成熟的解決方案和availiable了很多的語言(C,Python和......,只是谷歌的dbus +你喜歡的語言),但沒有那麼快,因爲共享內存,但對於幾乎不需要(硬)實時屬性的所有東西來說,仍然足夠快。

+0

但它會通過網絡工作嗎? (另外dbus在windows和macosx上運行良好?) - 我已經將這些要求添加到了問題中。 –

2

你正在從框架中尋求很多東西;網絡使能,多平臺,多語言,高性能(理想情況下應該進一步說明 - 這是什麼意思,帶寬?延遲?什麼是「足夠好」;我們正在談論kB/s,MB/s,GB /秒?1毫秒或1000毫秒的往返?)另外還有很多未提及的事情可以很容易地發揮作用,例如你需要認證還是加密?有些框架爲您提供了這樣的功能,其他框架則依靠您自己實現這個難題。

可能沒有銀彈產品會給你一個理想的解決方案,同時優化所有這些要求。至於你的問題的'附加'部分 - 是的,如果你只將語言要求限制在python中,或者進一步區分關鍵字和好的要求,那麼會有更多的解決方案。

您可能想要看的一項技術是Versile Python(完全披露:我是開發人員之一)。它是多平臺的,支持python v2.6 +/v3和java SE6 +。關於性能,這取決於你的要求。如果您對該技術有任何疑問,只需詢問forum

4

我已經使用了Redis引擎。 極其簡單輕量級

服務器側的作用:

import redis 
r = redis.Redis() # Init 
r.subscribe(['mychannel']) # Subscribe to "channel" 
for x in r.listen(): 
    print "I got message",x 

客戶端側的作用:

import redis 
r = redis.Redis() # Init 
r.publish('mychannel',mymessage) 

「消息」 是(任意大小的)字符串。如果您需要傳遞複雜的數據結構,我喜歡使用json.loads和json.dumps在python字符串/數組和字符串之間進行轉換 - 「pickle」也許是更好的方法來實現python與python的通信,儘管JSON意味着「另一面」可以寫成任何東西。

現在Redis還有十億個其他的東西 - 它們本質上都很簡單。