n8n 中的並行執行

我想知道是否有任何方法可以在n8n中执行两个分支并行而不使用任何子流程,如果有,请告诉我方法,这对我会很有帮助

描述问题/错误/问题

错误信息是什么(如果有的话)?

请分享您的工作流

(在画布上选择节点,使用键盘快捷键 CMD+C/CTRL+C 和 CMD+V/CTRL+V 复制并粘贴工作流。)

分享最后一个节点返回的输出

关于您的n8n设置的信息

  • n8n版本:2.34.6
  • 数据库(默认值:SQLite):
  • n8n EXECUTIONS_PROCESS设置(默认值:own,main):main
  • 通过以下方式运行n8n(Docker、npm、n8n云、桌面应用):Hostinger
  • 操作系统:Ubuntu

Hi @AstralVyom

n8n 不會同時執行兩個分支。在一次執行中,引擎是順序性的,它會完全完成一個分支後才開始下一個,順序由畫布位置決定,最上方的優先,然後是最左邊的。因此沒有任何節點或設定能使兩個分支並行執行,無論你是否使用子流程都是如此。

嗨 @AstralVyom
你可以把工作流程分成兩個分支,但據我所知,n8n 不會同時執行兩個分支。它們仍然會在同一次執行中一個接一個地運行。

如果你真的需要平行執行,實際的方法是將它們作為單獨的執行來觸發,通常透過子工作流程或 webhook。

所以如果你想在一個工作流程內保持所有內容並避免使用子工作流程,目前沒有原生方式可以讓兩個普通分支真正平行執行。

以上兩個答案都是正確的:在一次執行內,引擎是順序執行的,畫布位置決定順序,所以唯一真正的平行性是通過子工作流或 webhook 進行的單獨執行。值得了解當你採取這條路線時放棄了什麼,因為這在測試時不會顯現出來。

執行子工作流並將「等待子工作流完成」關閉:父級立即進行到下一個節點,所以父級執行可以完成並被標記為成功,而一個分支仍在運行,或已經失敗。父級上的勾號不再是關於該分支應該執行的工作的陳述。

webhook 版本有相同的結構。將「回應」設置為「立即」時,調用者會收到「工作流已啟動」的消息。這是對請求的收據,而不是對結果的收據。

如果分支只是計算並傳回數據,這些都無關緊要。但如果兩個分支都涉及 n8n 之外的東西(一個工作表、一份發票、一個 API 呼叫),就會變得重要,因為「這是否真的完成了」是父級執行不再回答的問題。有三件事可以再次使其可以回答:

  • 讓每個分支在某處寫入自己的終端狀態:一個 id 加上 finished/failed。然後當兩個 id 都出現時,任務就完成了,而不是當父級變綠時。
  • 從父級傳遞一個相關 id 到每個分支並將其保存在數據中。沒有它,一旦數量增加,在執行列表中匹配父級與其子級就是猜測。
  • 在子工作流本身上設置錯誤工作流。不等待的父級不會為你顯示它們的錯誤,而無人監控的分支按設計會靜默失敗。

如果你想讓分支平行運行但仍受到監督,誠實的版本是:父級啟動兩個分支,父級不等待,而某個單獨的東西在任何下游將結果視為完整之前確認兩個分支都完成了。

Hi @AstralVyom
Code 節點執行純 JavaScript 並支援 promise,因此在一個 Code 節點內啟動的兩個非同步呼叫確實會重疊。將兩個分支合併到單一節點是單一執行內可用的唯一並行形式:

const [a, b] = await Promise.all([
  this.helpers.httpRequest({ method: 'GET', url: 'https://api.one/endpoint', json: true }),
  this.helpers.httpRequest({ method: 'GET', url: 'https://api.two/endpoint', json: true }),
]);
return [{ json: { a, b } }];

fetch 在 Code 節點中未定義,this.helpers.httpRequest 是在 2.0 task runner 沙箱中運作的存取器。

這只在分支等待 I/O 時才能爭取時間。兩個 CPU 密集型分支仍會逐一執行,因為無論如何都是單一執行緒。

Hi @AstralVyom

畫布上的兩個分支並不是真正並行執行的。n8n 會逐一執行每個分支,根據垂直位置先執行上面的分支。

我特意使用該順序來確保 Telegram 警報在 Google Sheets 附加之前觸發,因此改變連接順序不會使它們並行執行。您的 EXECUTIONS_PROCESS 設定不會改變此行為。

如果沒有獨立的工作流程執行或外部非同步服務,就沒有辦法讓兩個分支同時運行。如果您只需要兩個分支在繼續前都完成,請正常分割它們並用 Merge 節點連接,但它們仍然會按順序執行。

是的,其實可以的…使用 http 節點並按照這裡解釋的架構設計您的工作流程: