我读到消息队列优先于subprocess.Popen()
.据说消息队列是可扩展的解决方案。我想了解是怎么回事。
我只想列出消息队列相对于subeprocess.Popen()
的好处,以便我可以说服我的上级使用消息队列而不是subprocess
这些是完全独立和不同的东西。
subprocess.Popen()
只是为您传递给它的特定命令生成(通过调用fork
并exec
)新的操作系统进程。因此,它非常适合您需要在单独的进程中执行某些内容并(可选)获取执行结果(以有点尴尬的方式,通过管道)的情况。
队列(如Celery或ActiveJob)为您提供了两个主要功能:
存储(- 更准确地说,是一些现有存储的接口,如PostgreSQL或MongoDB),用于您的任务(或消息),这些任务将在进入该存储之前自动序列化。
- 轮询此存储并实际执行这些任务的工作线程(在执行之前反序列化它们,也自动执行)。
因此,即使在分布式环境中,也可能有很多工作线程。它不仅为您提供了垂直可扩展性,还为您提供了水平可扩展性(通过将员工保持在单独的机器上)。
另一方面,队列更适合异步处理(即用于稍后需要执行且您现在不需要结果的作业),并且比简单的进程生成更重量级。
因此,如果您有简单的一次性作业,只是要在主流程之外的某个地方执行 - 请使用流程。
如果你有一堆不同的作业需要异步执行,并且你想要能够扩展该过程,你应该使用队列,它们会让生活更轻松。