2011-03-25 25 views
3

我有一個創建了它需要在Python 2.5〜coummunicate若干子過程的過程。我使用子進程模塊來啓動進程,將stdin和stdout設置爲subprocess.PIPE。到現在爲止還挺好。在Python中通過stdin/stdout/pipes進行通信的預定義協議?

在一個循環,我然後運行select.select()每個subproccess的標準輸出流等着他們告訴我,他們已經準備好。然後,我寫信給他們的stdin,讓他們工作並重復這個過程。

目前,我只是用stdin.write和stdout.readline瓶坯的通信。但是,我希望能夠在流程之間傳遞複雜的消息。簡單的換行符終止的消息是不夠的(除非我以某種方式大步跨越消息中的新行)。我想我可以在字節長度前綴的所有信息,這樣我的消息看起來像:

6:foobar 

但是,這使我想到我的問題:沒有這樣的事情存在?我真的不想在這裏重新發明輪子。我想要一個圖書館,告訴我什麼時候有一個完整的信息準備好,然後交給我。還有很多其他協議以各種方式執行此類操作(TCP,Message Queue Server,HTTP等),但它們對我的用例來說都是過度的。在Python中的進程間傳遞消息的正確方法是什麼?

回答

1

您可以使用jsonpickle對包含該消息的數據結構進行編碼,然後在另一側使用相同的名稱來讀取該消息。

+0

當然,但我仍然需要擔心逃逸或者在確定該消息的界限,沒有一些其他的方式? (也許JSON逃脫新的生產線,我不知道味酸。)我也想確保,如果消息中談到件通過時,由於緩衝,我不會錯過任何東西。 – 2011-03-25 14:57:17

+0

如果消息不是太大,並且不會太快,我不會看到讓'select'處理它的問題。如果您發現消息速率有問題,那麼您可能需要查看可能能夠處理級聯消息的漸進式解析器。 – 2011-03-25 14:59:22

+0

快速瀏覽cPickle會告訴我它會在其字符串中放置新的行,這意味着它自己脫離表格: >>> print pickle.dumps(「a \ nb」) S'a \ nb' p1 。 – 2011-03-25 15:03:05

1

有框架,真正幫助您解決這種功能的。如果您想發送更復雜的消息而不打擾同步問題。真的好框架的一些例子:

這些框架,主要是,在TCP/IP之上的工作。對你的東西稍微不同的方法。但是,也許你應該考慮一些事情。