我有一个 python 程序,我想同时运行多个具有不同参数的实例。这些实例彼此之间不进行通信。在单独的终端中运行每个实例太乏味了。我考虑使用多处理模块将每个实例作为单独的进程运行,但是我希望能够随时停止和重新启动某些单独的实例,而不会中断其他正在运行的实例。是否有任何流程管理器或类似的东西可以用来做到这一点?
可以使用多种方法同时运行具有不同参数的多个 Python 程序实例,并且能够根据需要停止和重新启动它们,而不会影响其他实例。以下是两种流行的选项:
1. 使用任务队列(例如 Celery)
- 如何运作: 任务队列允许将任务(在本例中为的 Python 脚本实例)排队,并在工作进程池中异步执行它们。可以拥有多个工作进程来并行处理任务。
-
优点:
- 稳健性: 如果一个工作进程失败,任务队列可以确保该任务由另一个工作进程处理。
- 可扩展性: 可以轻松地通过添加更多工作进程或计算机来扩展的设置以处理更多任务。
- 监控和管理: Celery 提供了用于监控任务进度和管理工作进程的工具,例如 Celery Flower。
-
缺点:
- 复杂性: 设置任务队列比其他方法更复杂,需要了解消息代理(例如 RabbitMQ 或 Redis)。
2. 使用进程管理器(例如 Supervisor)
- 如何运作: 进程管理器用于控制和管理系统上的进程,包括启动、停止和监控它们。可以将 Python 脚本配置为在 Supervisor 下运行,并且能够独立地控制它们。
-
优点:
- 简单性: 与设置任务队列相比,设置 Supervisor 更容易。
- 轻量级: Supervisor 资源消耗少,使其成为管理少量进程的不错选择。
-
缺点:
- 可扩展性有限: 与任务队列相比,Supervisor 的可扩展性较差,这使得它不太适合处理大量进程。
下面简要介绍了如何使用 Supervisor 来实现的用例:
-
安装 Supervisor:
bash pip install supervisor
-
创建 Supervisor 配置文件: 创建一个名为
supervisord.conf
的配置文件,并添加以下内容,根据的脚本和所需行为进行修改:[program:my_script] command=/usr/bin/python /path/to/your/script.py --arg1 value1 directory=/path/to/your/script/directory autostart=true autorestart=true stderr_logfile=/var/log/my_script.err.log stdout_logfile=/var/log/my_script.out.log
-
将
/usr/bin/python
替换为的 Python 解释器的路径。 -
将
/path/to/your/script.py
替换为的 Python 脚本的路径。 -
将
--arg1 value1
替换为要传递给脚本的参数。 -
为要运行的每个脚本实例重复
[program:...]
部分,使用不同的名称和参数。 -
启动 Supervisor:
bash supervisord -c /path/to/your/supervisord.conf
-
控制的脚本:
bash supervisorctl -c /path/to/your/supervisord.conf [start|stop|restart] my_script
将my_script
替换为的脚本名称,以及所需的命令(start
、stop
或restart
)。
这些只是两种可用于运行 Python 程序的多个实例的方法。选择的最佳方法取决于的特定需求和约束。
标签:python,multithreading,asynchronous,multiprocessing From: 78805612