我需要创建一个信号量来限制特定子进程的并行计数。我将 gunicorn 与 eventlet 工作人员一起使用,并允许许多同时连接。大多数情况下,这些都在等待远程数据。但是,它们都会在某个时候进入处理阶段,这涉及调用子进程。虽然这个子进程不应该经常并行运行,因为它很耗内存/CPU。
是否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、Celery、Gearman 这样的作业队列系统。或者,您可能希望在现有消息传输(如 NSQ、RabbitMQ、ZeroMQ)之上构建自定义解决方案。