2014-03-05 48 views
1

我需要創建一個信號來限制特定子進程的並行計數。我使用gunletorn與eventlet工作人員,並允許許多同時連接。大多數情況下這些都在等待遠程數據。但是,它們都在某個時間點進入處理階段,這涉及到調用子進程。儘管這個子過程不應該經常並行運行,因爲它是內存/ CPU飢餓。Evenlet信號量如何限制對特定子進程的調用?

threading.Semaphore正確的monkey_patch'd和可用於gunicorn內的eventlet?

回答

1

正如我理解這個問題:

  • 一個gunicorn過程(這是關鍵)派生ñ綠色線程
  • 每個工人可以催生一個或多個子
  • 要限制總數量的子進程

在這種情況下,是的,信號量將按預期工作。

但是,如果你有多個進程,他們將有單獨的信號量實例,你會觀察到更多的子進程。在這種情況下,我建議將子進程職責移動到一個單獨的應用程序中,並運行在同一臺機器上,並通過你喜歡的API(RPC/socket/message queue/dbus/etc)調用它。你可以設計系統是這樣的:

user -> gunicorn (any number of processes) 
gunicorn -> one subprocess manager 
manager -> N subprocesses 

經理監聽來自gunicorn工作,產生一個子進程如果需要的話,也許重用現有的子進程。你可能喜歡Beanstalk,芹菜,Gearman等工作隊列系統。或者您可能希望在現有的消息傳輸(如NSQ,RabbitMQ,ZeroMQ)之上構建自定義解決方案。

+0

是的,這看起來會發生什麼。 Gunicorn實際上是產生幾個進程(每個工作者一個進程)。每個工人都有獨特的信號量。所以4名工人,信號量爲2,將我限制爲8個進程。 –

+0

我修改瞭解答多個gunicorn工人的答案。 – temoto

相關問題