【问题标题】:How to start and share one and only one separate process for several processes in Python?如何在 Python 中为多个进程启动和共享一个且只有一个单独的进程?
【发布时间】:2012-08-13 13:45:30
【问题描述】:

我知道如何使用multiprocessing来启动一个单独的进程并进行并发数据处理。

我现在想知道的是,如果我有几个主进程(比如说几个 wsgi 进程),我怎样才能为所有主进程只创建一个单独的进程?

每个主进程都应该能够使用队列与单独的进程通信,但每个主进程都在不同的 Python VM 中单独启动。

例如:

  • 进程 1 -> 启动单独的进程 -> 与单独的进程对话
  • 进程 2 -> 注意单独的进程已启动,不要启动另一个 -> 与单独的进程对话
  • 进程 3 -> 注意单独的进程已启动,不要启动另一个 -> 与单独的进程对话

如果一个进程注意到进程已经死亡,它可以重新启动它。

这可能吗?以及如何?

如果是,假设它必须涉及使用 PID 文件。

【问题讨论】:

  • Python 虚拟机?我猜你的意思是 Python 解释器。

标签: python multiprocessing


【解决方案1】:

是的,这是可能的。你可以使用 pidfile 或者(如果你使用 Linux)你可以使用这样的套接字:https://stackoverflow.com/a/7758075/639295

您还可以考虑使用 redis 之类的东西来进行进程间通信。它有一个简单的 Python api,可以很容易地让多个进程监听另一个进程。

这是一个双方的例子,大类的方法。

def redis_listener(self):
    r = redis.Redis(host='localhost', db=0)
    pubsub = r.pubsub()
    pubsub.psubscribe('a.channel')
    for message in pubsub.listen():
        logging.info('Received message: %s' % (message,))
        self.parse_message(message)


def redis_broadcaster():
    r = redis.Redis(host='localhost', db=0)
    pubsub = r.pubsub()
    pubsub.psubscribe('a.*')
    for message in pubsub.listen():
        if message['pattern'] == None:
            continue
        symbol = message['pattern'].split('.')[1]
        for listener in WATCHERS[symbol]:
            listener.write_message(unicode(message['data']))

【讨论】:

  • 整个目的是避免设置额外的工具。否则我只会用芹菜。感谢您的链接,它很有帮助。我仍然不确定如何将信息排队到该进程。
  • Linux 为 IPC 提供了多种方法。看看这里:tldp.org/LDP/lpg/node7.html,然后选择看起来最简单的一个。命名管道可能是最基本的。
猜你喜欢
  • 1970-01-01
  • 2014-07-15
  • 2012-07-20
  • 1970-01-01
  • 2019-04-02
  • 2014-09-21
  • 1970-01-01
  • 2015-03-22
  • 2017-09-10
相关资源
最近更新 更多