Sync vs Async in LangSmith Deployment: BG_JOB_ISOLATED_LOOPS + invoke vs ainvoke

Last updated: January 6, 2026

Question

When using LangSmith Deployment (Agent Server) with BG_JOB_ISOLATED_LOOPS=true and ChatOpenAI.invoke, is there a difference in efficiency compared to using ChatOpenAI.ainvoke?

Answer

Yes, ainvoke is still more efficient, but the gap narrows with BG_JOB_ISOLATED_LOOPS=true.

What BG_JOB_ISOLATED_LOOPS=true does:

  • Runs background jobs in a separate event loop

  • Prevents sync invoke calls from blocking the main API

  • Keeps health checks and other requests responsive

What it does NOT do:

  • Make multiple LLM calls run in parallel within a single run

Key Difference

Within a single run, invoke is still sequential:

# Sequential - slower even with isolated loops
r1 = llm.invoke(m1)
r2 = llm.invoke(m2)
r3 = llm.invoke(m3)
# Total time: t1 + t2 + t3

With ainvoke, you get true parallelism:

# Parallel - much faster
results = await asyncio.gather(
    llm.ainvoke(m1),
    llm.ainvoke(m2),
    llm.ainvoke(m3)
)
# Total time: max(t1, t2, t3)

Summary

Scenario

Difference

Single LLM call per node

Minimal

Multiple parallel calls per node

ainvoke is significantly faster

High concurrency

ainvoke provides better throughput

Bottom line: BG_JOB_ISOLATED_LOOPS=true is a good safety net for sync code, but native async is optimal for maximum throughput.