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

时间:2017-06-16 15:29:10

标签: python django celery django-celery

我读到该消息队列比subprocess.Popen()更受欢迎。据说消息队列是可扩展的解决方案。我想知道它是怎么回事。

我只想列出消息队列优于subeprocess.Popen()的好处,以便我可以说服我的上司使用消息队列而不是subprocess

1 个答案:

答案 0 :(得分:4)

这些是完全不同的东西。

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

队列(如Celery或ActiveJob)为您提供了两个主要内容:

  • 为您的任务(或消息)存储(更确切地说,是一些现有存储的接口,如PostgreSQL或MongoDB),这些任务将在转移到该存储之前自动序列化。
  • 轮询此存储并实际执行这些任务的工作人员(在执行之前对其进行反序列化,也是自动执行)。

因此,可能有很多工人,甚至可能在分布式环境中。它不仅为您提供垂直可扩展性,还为横向可扩展性(通过将您的工作人员保留在不同的计算机上)。

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

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

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