2017-06-16 64 views

回答

4

這些都是完全獨立的,不同的東西。

subprocess.Popen()簡單產生(通過調用forkexec)您傳遞給它的特定命令的新OS進程。因此,對於需要在獨立進程中執行某些操作並(可選)獲取執行結果(通過管道以某種尷尬的方式)執行的情況,這非常適用。

隊列(如芹菜或ActiveJob)爲您提供了兩兩件事:

  • 存儲(更準確地說,一個接口,一些現有的存​​儲,如PostgreSQL或MongoDB中)爲您的任務(或消息),這是在進入該存儲之前將自動序列化。
  • 輪詢此存儲並實際執行這些任務的工作人員(在執行之前將其反序列化,也會自動執行)。

因此,可能有很多工作人員,甚至可能在分佈式環境中。它不僅可以提供垂直可伸縮性,還可以提供水平可伸縮性(將工作人員放在不同的機器上)。另一方面,隊列更適合於異步處理(即,對於需要稍後執行並且現在不需要結果的作業)並且比簡單進程產卵更重量級。

因此,如果您有簡單的一次性工作只是在主流程之外的某個地方執行 - 請使用流程。

如果你有一堆需要異步執行的不同作業,並且你希望能夠擴展這個過程,你應該使用隊列,它們會讓生活變得更容易。

+0

別的不是這個嗎? –

+0

重量級排隊是什麼意思? –