gpt4 book ai didi

python - 检测进程是否已经在运行并与之协作

转载 作者:太空狗 更新时间:2023-10-29 21:07:53 26 4
gpt4 key购买 nike

我正在尝试创建一个程序来启动一个进程池,比如说,5 个进程,执行一些操作,然后退出,但让 5 个进程保持打开状态。稍后用户可以再次运行该程序,而不是启动新进程,而是使用现有的 5 个进程。基本上它是一个生产者-消费者模型,其中:

  1. 生产者的数量各不相同。
  2. 消费者数量不变。
  3. 生产者可以由不同的程序甚至不同的用户在不同的时间启动。

我正在使用内置的 multiprocessing 模块,目前在 Python 2.6.4 中,但最终打算迁移到 3.1.1。

这是一个基本的使用场景:

  1. 开始状态 - 没有进程在运行。
  2. 用户启动program.py 操作 - 一个生产者,五个消费者运行。
  3. 操作完成 - 五个消费者正在运行。
  4. 用户启动program.py 操作 - 一个生产者,五个消费者运行。
  5. 用户开始program.py 操作 - 两个生产者,五个消费者在运行。
  6. 操作完成 - 一个生产者,五个消费者在运行。
  7. 操作完成 - 五个消费者正在运行。
  8. 用户启动 program.py stop 并完成 - 没有进程在运行。
  9. 用户启动 program.py start 并完成 - 五个消费者正在运行。
  10. 用户启动program.py 操作 - 一个生产者,五个消费者运行。
  11. 操作完成 - 五个消费者正在运行。
  12. 用户启动 program.py stop 并完成 - 没有进程在运行。

我的问题是我不知道从哪里开始:

  1. 检测消费者进程正在运行。
  2. 从以前不相关的程序获得对它们的访问权限。
  3. 以跨平台的方式执行 1 和 2。

一旦我能做到这一点,我就知​​道如何管理流程。必须有一些可靠的方法来检测现有进程,因为我看到 Firefox 这样做是为了防止 Firefox 的多个实例运行,但我不知道如何在 Python 中做到这一点。

最佳答案

有几种常见的方法可以完成您的第 1 项(检测正在运行的进程),但要使用它们,您首先需要稍微调整一下您的想法,即这些后台进程是如何在第一次调用程序时启动的.

不要将第一个程序视为启动五个进程然后退出,而是将其视为第一个实例启动并且没有退出。它可以创建文件锁(防止应用程序多次出现的常用方法之一),或仅绑定(bind)到某个套接字(另一种常用方法)。任何一种方法都会在第二个实例中引发异常,然后第二个实例知道它不是第一个实例,并且可以将注意力重新集中在联系第一个实例上。

如果您正在使用多处理,您应该能够简单地使用Manager支持,这涉及绑定(bind)到套接字以充当服务器。

第一个程序启动进程,创建队列、代理或其他任何东西。它创建一个管理器以允许访问它们,可能允许 remote access .

后续调用首先尝试联系预定义套接字上的所述服务器/管理器(或使用其他技术来发现它所在的套接字)。他们没有执行 server_forever() 调用 connect() 并使用通常的 multiprocessing 机制进行通信。

关于python - 检测进程是否已经在运行并与之协作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2031121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com