2012-10-23 69 views
4

我有一個包含字典(稱爲請求)的列表(稱爲requestRoster)。 「請求」字典中的項目就像'requestTime'和'thisURL'。例如: -如何在Python中創建進程間數據結構?

[ 
{'thisURL': 'http://localhost/bikes', 'requestTime': datetime.datetime(2012, 10, 18, 0, 41, 34)}, 
{'thisURL': 'http://localhost/clothing', 'requestTime': datetime.datetime(2012, 10, 18, 0, 41, 35)} 
] 

我使用multiprocessing.Process以產生新的進程發出的每個請求。

我希望每個進程都更新requestRoster,爲每個請求添加一個「響應」項。

我該怎麼做?

我試過使用multiprocessing.Manager()來做一個manager.list()和一個manager.Namespace()。無論讓我做我想做的事情,我想是因爲這個: http://docs.python.org/library/multiprocessing.html#multiprocessing.managers.SyncManager.list

我想我可以用一個multiprocessing.Lock()來

  • 獲得互斥
  • 使副本過程
  • 內的requestRoster修改局部requestRoster
  • 覆蓋與所述局部一個
  • 釋放互斥「globablised」請求名冊

......但它似乎有點詳細,我不知道我是否缺少更簡單的東西。異步回調會很好。

+0

你的工作人員是否需要從名冊中讀取,或者只是寫回復?從你的描述來看,似乎是一個簡單的隊列,或者是連接調度員和每個工作人員之間的管道,以便將你的響應數據返回,然後調度員可以負責將響應記錄在呼叫歷史記錄中的正確條目中。 –

+0

好吧,一個隊列。所以調度員派遣;工人工作;工作人員將結果添加到隊列中;調度員考慮隊列並將響應出隊。像那樣的東西?我喜歡這一點......我唯一擔心的是讓調度員對任何事情負責,而不是派遣,因爲當數百個請求必須同時派發時,它已經被工作壓垮了。我認爲,工人進程有一個真正的例子可以訪問「全局」數據結構......並且工作人員可以完成所有工作,包括更新。 – dave

+0

這對我越來越重要。我只能在有時間的時候讓調度員離隊 - 但大部分時間都集中在調度上。感謝您的輸入。 – dave

回答

2

如果可以的話,避免使用共享內存結構會更好。在這裏,沒有理由讓流程自己寫入字典列表 - 相反,您可以讓主流程對此負責,並且僅將URL提取到流程。

我喜歡concurrent.futures.<Process|Thread>PoolExecutor這種事情。

+0

感謝您的輸入,但我在Python 2.7.3上,所以我不認爲我可以使用concurrent.futures(儘管看起來不錯)。我認爲如果孩子進程(或者任何你想要調用他們的人)寫入到列表中的話會更好,因爲主進程已經被工作壓垮 - 例如,當數百個請求必須「同時」 。 – dave

+0

有一個Python 2.x backport,我可以確認作品! – katrielalex

0

我覺得這個方法應該爲你工作:

接線員:

create logger_queue 
create logger process, initialize with logger_queue 
for each request 
    create worker_pipe 
    create worker process, initialize with send end of worker_pipe 
    push receive end of worker_pipe over logger_queue 

工人:

make request 
push response over connection 

記錄儀:

while True 
    for connection on logger_queue 
     create new element in logging list 
     link connection to new logging list element 
    for each open connection 
     poll for message 
     if message 
      store message to log 
      close connection 

的記錄過程也可以賽跑無論您想要的輸出例程如何,您甚至不必擔心從記錄的數據集中讀取另一個進程。請注意,上面的連接是指multiprocessing.Connection

+0

輸入非常感謝,但考慮到我只是想全球化一個數據結構大量複雜。我不想讓隊列,管道和記錄器(更多問題)我只希望工作人員能夠在主進程中更新數據......(但是,再次感謝您的意見,非常感謝) – dave

+0

共享數據結構非常複雜,並且有很多開銷和陷阱。如果你能避免它們,你可能應該。如果您只想在主進程中完成所有操作,請將記錄器邏輯放入調度程序中,然後刪除隊列。我以這種方式解決了這個問題,因爲你說你想調度員精益。 –

0

我設法通過使用線程而不是多處理來做到這一點。由於工作人員與調度員處於同一個進程內,因此他們可以更新requestRoster。

+0

因爲你的工作人員是I/O綁定的,所以線程可能會很好,但請注意,如果你遇到CPU綁定的性能問題,GIL會強制你改用多進程。 –

+0

確實。並再次感謝您的評論。 – dave

相關問題