【问题标题】:Does Electron's main thread block BrowserWindow?Electron 的主线程会阻塞 BrowserWindow 吗?
【发布时间】:2020-07-22 13:48:24
【问题描述】:

我正在构建一个运行 Electron 应用程序的应用程序。我看到的是,当主线程忙于运行自己的操作时,BrowserWindow 的线程将被阻塞(就像 BrowserWindow 本身正在运行 javascript 时一样)。

这些是否共享同一个线程?如果是这样,将它们分开的最佳方法是什么?

【问题讨论】:

  • 我想我可以推断出您的意思,但是您能否扩展“像在 Web 应用程序中一样影响 BrowserWindow”。 BrowserWindow 应该创建另一个 Renderer 进程。那个Renderer和Main之间的通信当然会使用同一个线程,还有一些其他的操作需要在主进程中完成。

标签: electron single-threaded


【解决方案1】:

首先,它并不是真正的 Electron 的主线程。说它是Node的线程会更准确。

其次,主进程的主线程用于(当然还有其他事情)在主进程和BrowserWindow 使用的渲染器进程之间进行通信,所以如果您的主线程正在执行大型同步操作,你的主线程会阻塞,这肯定会影响你的窗口的响应能力。

分离它们的最佳方法是什么?

我真的无法提供一个适用于所有情况的通用解决方案。你应该举一个具体的例子。你的主线程在忙什么?

您可以考虑使用 WebWorkers。见here

【讨论】:

  • 很好的参考,谢谢,你能说像 napa 这样的东西在这种情况下也有用吗?
  • @user2167582 什么是纳帕?
  • github.com/Microsoft/napajs,它就像一个子进程的包装器。但是从你们的 cmets 来看,我推测这种性质的任何东西都可以工作?
  • 您可以使用Node worker threads。电子相关的陷阱thread.
【解决方案2】:

简而言之,是的,Electron 的主线程可以(有点违反直觉)“阻塞”渲染器 UI。

显然[0],Electron 在后台很大程度上依赖于正在进行的主渲染器通信,这是您进行显式 IPC 调用的补充。因此,如果主线程锁定了某些操作,UI 会像疯了一样滞后即使你自己的 IPC 调用没有被阻塞

解决方法:

  • 您可以在 main 中使用 Node worker threads[1]。

  • 您可以使用 Web Worker,无论是否旋转“隐藏渲染器”。

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多