1

我需要创建一个信号量来限制特定子进程的并行计数。我将 gunicorn 与 eventlet 工作人员一起使用,并允许许多同时连接。大多数情况下,这些都在等待远程数据。但是,它们都会在某个时候进入处理阶段,这涉及调用子进程。虽然这个子进程不应该经常并行运行,因为它很耗内存/CPU。

是否threading.Semaphore正确monkey_patch'd并可以与gunicorn内的eventlet一起使用?

4

1 回答 1

1

据我了解问题:

  • 一个 gunicorn 进程(这是至关重要的)产生 N 个绿色线程
  • 每个工人可以产生一个或多个子进程
  • 你想限制子进程的总数

在这种情况下,是的,信号量将按预期工作。

但是,如果您有多个进程,它们将具有单独的信号量实例,您将观察到更多的子进程。在这种情况下,我建议将子进程职责转移到单独的应用程序中,在同一台机器上运行并通过您喜欢的 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)之上构建自定义解决方案。

于 2014-03-06T10:27:30.110 回答