我需要创建一个信号量来限制特定子进程的并行计数。我正在使用gunicorn与eventlet工作者并允许许多同时连接。大多数这些都在等待远程数据。但是,它们都在某个时刻进入处理阶段,这涉及调用子进程。但是这个子进程不应该经常并行运行,因为它会占用内存/ CPU。
threading.Semaphore
是否正确使用了Monkey_patch并且可以在gunicorn中使用eventlet?
答案 0 :(得分:1)
据我了解问题:
在这种情况下,是的,信号量将按预期工作。
但是,如果您有多个进程,它们将具有单独的信号量实例,您将观察到更多子进程。在这种情况下,我建议将子进程职责移动到一个单独的应用程序,在同一台机器上运行,并通过您喜欢的API(RPC / socket / message queue / dbus / etc)调用它。您可以像这样设计系统:
user -> gunicorn (any number of processes)
gunicorn -> one subprocess manager
manager -> N subprocesses
管理员从gunicorn中侦听作业,如果需要可以生成子进程,可能会重用现有的子进程。您可能喜欢像Beanstalk,Celery,Gearman这样的作业队列系统。或者您可能希望在现有的消息传输(如NSQ,RabbitMQ,ZeroMQ)之上构建自定义解决方案。