我需要創建一個信號來限制特定子進程的並行計數。我使用gunletorn與eventlet工作人員,並允許許多同時連接。大多數情況下這些都在等待遠程數據。但是,它們都在某個時間點進入處理階段,這涉及到調用子進程。儘管這個子過程不應該經常並行運行,因爲它是內存/ CPU飢餓。Evenlet信號量如何限制對特定子進程的調用?
是threading.Semaphore
正確的monkey_patch'd和可用於gunicorn內的eventlet?
我需要創建一個信號來限制特定子進程的並行計數。我使用gunletorn與eventlet工作人員,並允許許多同時連接。大多數情況下這些都在等待遠程數據。但是,它們都在某個時間點進入處理階段,這涉及到調用子進程。儘管這個子過程不應該經常並行運行,因爲它是內存/ CPU飢餓。Evenlet信號量如何限制對特定子進程的調用?
是threading.Semaphore
正確的monkey_patch'd和可用於gunicorn內的eventlet?
正如我理解這個問題:
在這種情況下,是的,信號量將按預期工作。
但是,如果你有多個進程,他們將有單獨的信號量實例,你會觀察到更多的子進程。在這種情況下,我建議將子進程職責移動到一個單獨的應用程序中,並運行在同一臺機器上,並通過你喜歡的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)之上構建自定義解決方案。
是的,這看起來會發生什麼。 Gunicorn實際上是產生幾個進程(每個工作者一個進程)。每個工人都有獨特的信號量。所以4名工人,信號量爲2,將我限制爲8個進程。 –
我修改瞭解答多個gunicorn工人的答案。 – temoto