2012-07-16 127 views
1

簡短的問題:是否有可能有N工作進程和balancer進程,它會發現工人在這個時候什麼也不做,並通過UnitOfWork它?Python多處理負載平衡器

長的問題: 想像這樣的類,女巫會被繼承某些任務:

class UnitOfWork: 
    def __init__(self, **some_starting_parameters): 
    pass 
    def init(self): 
    # open connections, etc. 
    def run(self): 
    # do the job 

啓動平衡器和工作進程:

balancer = LoadBalancer() 
workers = balancer.spawn_workers(10) 

部署工作(平衡器應該找一個懶工人,並將任務傳遞給它,否則如果每個工人都很忙,則將UOW添加到隊列中並等待至空閒工人):

balancer.work(UnitOfWork(some=parameters)) 
# internally, find free worker, pass UOW, ouw.init() + ouw.run() 

這是可能的(或它是瘋了)?

PS我熟悉multiprocessingProcess類,並處理池,但:

  • Process實例啓動一個進程(是的:)) - 我想工人的固定NUM
  • 我想Process可以製作通用作品的實例

回答

2

您在平衡器中不需要任何智能;只有Queue會做你想做的事情。將每個工作單元放入隊列中,讓工作人員循環,從隊列中取出一個工作單元並在每次迭代中處理它。我認爲沒有任何問題將UnitOfWork的實例傳遞到隊列中。

如果你有一個固定的工作量要完成,你可以創建一個「不需要做的工作」的工作單位(一個「毒藥丸」),告訴工人關閉,並且畢竟經常工作被放入隊列中,將許多毒丸放入隊列中,與工人一樣。

+0

OMG :)更復雜的任務,它具有最簡單的答案:d - 你剛剛意識到,我已經做了在另一個項目這樣的事情,但我沒有從這個角度來看期待... – canni 2012-07-16 19:46:23

3

我建議你看看multiprocessing.Pool(),因爲我相信它完全可以解決你的問題。它運行N個「工作進程」,並且每個工作者完成一項任務時,提供另一個任務。並且不需要「毒丸」;這很簡單。

我一直在池上使用.map()方法。

Python multiprocessing.Pool: when to use apply, apply_async or map?

編輯:這是我寫的另一個問題的答案,我在我的答案使用multiprocessing.Pool()

Parallel file matching, Python