---页首---

Napi::ThreadSafeFunction::NonBlockingCall

队列积累与非阻塞机制

  1. NonBlockingCall 的工作原理
  napi_status status = g_tsfnSyncCaptureGuard.NonBlockingCall(
      new SyncRequest{preventCapture},
      [](Napi::Env env, Napi::Function jsCallback, SyncRequest* request) {
          syncCaptureGuard(request->preventCapture);
          delete request;
      });
  1. 关键理解-非阻塞 (NonBlocking)
  - NonBlockingCall 立即返回,不等待主线程执行
  - 调用者(守护线程)继续执行,不会停下来等待结果
  - 这就是"不阻塞守护线程"的含义
  1. 队列积累 (Queue Accumulation)
  时间线示例:

  t=0ms:   守护线程: syncCaptureGuardOnMainThread(true)  → 请求1入队
           主线程:   正在处理 HTTP 请求...

  t=100ms: 守护线程: syncCaptureGuardOnMainThread(true)  → 请求2入队
           主线程:   还在处理 HTTP 请求...

  t=200ms: 守护线程: syncCaptureGuardOnMainThread(true)  → 请求3入队
           主线程:   还在处理 HTTP 请求...

  t=250ms: 主线程:   HTTP 请求完成,开始处理队列
                     → 执行请求1 → syncCaptureGuard(true)
                     → 执行请求2 → syncCaptureGuard(true)
                     → 执行请求3 → syncCaptureGuard(true)
  1. 对比:BlockingCall vs NonBlockingCall
  // BlockingCall(阻塞)
  g_tsfn.BlockingCall(...);
  // ↑ 守护线程在这里停住,等待主线程执行完成
  // ↓ 主线程执行完成后,守护线程才继续

  // NonBlockingCall(非阻塞)
  g_tsfn.NonBlockingCall(...);
  // ↑ 守护线程立即继续,不等待
  std::this_thread::sleep_for(kPollInterval);  // 立即执行下一行
posted @ 2026-09-10 11:23  20190311  阅读(9)  评论(0)    收藏  举报
---页脚---