python subprocess.Popen() 与消息队列( celery )

标签 python django celery django-celery

我读到消息队列优于 subprocess.Popen()。据说消息队列是可扩展的解决方案。我想了解这是怎么回事。

我只想列出消息队列相对于 subeprocess.Popen() 的好处,这样我就可以说服我的上级使用消息队列而不是 subprocess

最佳答案

这些是完全不同的东西。

subprocess.Popen() 只是为您传递给它的特定命令生成(通过调用 forkexec)新的操作系统进程。因此,它非常适合您需要在单独的进程中执行某些内容并(可选)获得执行结果(通过管道以有点笨拙的方式)的情况。

队列(如 Celery 或 ActiveJob)为您提供两个主要功能:

  • 用于任务(或消息)的存储(更准确地说,是一些现有存储的接口(interface),如 PostgreSQL 或 MongoDB),这些任务(或消息)将在进入该存储之前自动序列化。
  • 轮询此存储并实际执行这些任务的工作人员(在执行之前反序列化它们,也是自动的)。

因此,即使在分布式环境中,也可能有很多工作人员。它不仅为您提供了垂直可扩展性,还为您提供了水平可扩展性(通过让您的工作人员在不同的机器上)。

另一方面,队列更适合异步处理(即需要稍后执行且您现在不需要结果的作业)并且比简单的进程生成更重量级。

因此,如果您有简单的一次性作业只是要在主流程之外的某个地方执行,请使用流程。

如果您有一堆需要异步执行的不同作业,并且您希望能够扩展该过程,则应该使用队列,它们会让生活变得更轻松。

关于python subprocess.Popen() 与消息队列( celery ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44592972/

相关文章:

docker - docker 群或 Rancher 牛的 celery worker

python - numpy.arrays 的 fsum,稳定求和

Python 类型错误 : Incorrect padding when write to image

python - Django:覆盖保存方法以处理 unique=True IntegrityError

python - 如何删除非托管 View 模型引用的 Django 模型

java - 我可以通过 rabbitmq 使用 java 发送任务到 celery 吗?

python - 如何在 torchvision.transforms 中找到 Normalize 的均值和 STD 的最佳值

python - 如何使用 setup.py 只安装依赖项?

django - DRF 错误消息的格式

python - Celery - 异步任务链