主线程冻结处理间隔,发送累积数据延迟巨大

问题描述 投票:0回答:1

我用 Tauri、Rust + JS React 编写了一个应用程序。当连接到应用程序的机器停止工作时,应用程序会向数据库发送相当于注入的信息,但处于其他状态(例如机器故障),以指示在机器故障期间可能发生了多少次注入,并查看:

I, [2024-03-28T03:29:07.845214 #723418]  INFO -- : [373a6e4c-86cf-47d5-8e6a-ac31ce78d1bc]   Parameters: {"cycles"=>[{"injector"=>"ST 70", "state"=>3, "length"=>55, "current_time"=>"3:29:7", "current_date"=>"2024-3-28"}], "cycle"=>{"cycles"=>[{"injector"=>"ST 70", "state"=>3, "length"=>55, "current_time"=>"3:29:7", "current_date"=>"2024-3-28"}]}}
I, [2024-03-28T03:29:07.854491 #723418]  INFO -- : [373a6e4c-86cf-47d5-8e6a-ac31ce78d1bc] Completed 200 OK in 9ms (Views: 0.3ms | ActiveRecord: 0.0ms | Allocations: 2381)

这是从我的应用程序发送到 Rails 服务器的 Rails 的最后一个日志。该请求发送由 JS 中的 Interval 处理,如您所见,每 55 秒触发一次,长度设置为 55,并且使用 axios 库发出请求。如果不是这样,一切都会好起来的 - 应用程序的下一个请求是在 43 分钟后发出的,就好像应用程序已经睡着了一样:

I, [2024-03-28T04:13:40.365444 #723418]  INFO -- : [6dae3bff-6f3f-44c4-9961-0b8b2b41f7c2]   Parameters: {"cycles"=>[{"injector"=>"ST 70", "state"=>3, "length"=>55, "current_time"=>"3:30:2", "current_date"=>"2024-3-28"}], "cycle"=>{"cycles"=>[{"injector"=>"ST 70", "state"=>3, "length"=>55, "current_time"=>"3:30:2", "current_date"=>"2024-3-28"}]}}
I, [2024-03-28T04:13:40.360601 #723418]  INFO -- : [6e537b40-79c4-4cec-82f1-5b348731f892] Started POST "/cycles" for *** at 2024-03-28 04:13:40 +0100
I, [2024-03-28T04:13:40.369729 #723418]  INFO -- : [6e537b40-79c4-4cec-82f1-5b348731f892] Processing by CyclesController#create as HTML
I, [2024-03-28T04:13:40.369892 #723418]  INFO -- : [6e537b40-79c4-4cec-82f1-5b348731f892]   Parameters: {"cycles"=>[{"injector"=>"ST 70", "state"=>3, "length"=>55, "current_time"=>"3:31:52", "current_date"=>"2024-3-28"}], "cycle"=>{"cycles"=>[{"injector"=>"ST 70", "state"=>3, "length"=>55, "current_time"=>"3:31:52", "current_date"=>"2024-3-28"}]}}
I, [2024-03-28T04:13:40.365232 #723418]  INFO -- : [89cb0939-2fd8-48f7-b8e1-c8a7f3667771] Started POST "/cycles" for *** at 2024-03-28 04:13:40 +0100
I, [2024-03-28T04:13:40.371292 #723418]  INFO -- : [89cb0939-2fd8-48f7-b8e1-c8a7f3667771] Processing by CyclesController#create as HTML
I, [2024-03-28T04:13:40.374927 #723418]  INFO -- : [89cb0939-2fd8-48f7-b8e1-c8a7f3667771]   Parameters: {"cycles"=>[{"injector"=>"ST 70", "state"=>3, "length"=>55, "current_time"=>"3:32:47", "current_date"=>"2024-3-28"}], "cycle"=>{"cycles"=>[{"injector"=>"ST 70", "state"=>3, "length"=>55, "current_time"=>"3:32:47", "current_date"=>"2024-3-28"}]}}

应用程序立即发送了在此“挂断”时间内生成的所有数据 - 尽管请求是在 4:13 发出的,但该请求包含 43 分钟前的数据,如您所见 (current_time)。就像服务器被这43分钟内出现的数据轰炸一样,JS意识到他必须将所有数据发送到服务器。所有axios请求都被维护在“缓存?”中不知何故,当应用程序醒来时,它立即发送了所有内容。问题是 JavaScript 是单线程的,我知道这一点,在这种情况下,主线程上发生了很多事情,但说实话 - 我见过处理更多事情的应用程序,并且一切都工作得很好。发生什么事了?需要帮忙。是否存在 JS 被冻结一段时间的已知问题?

reactjs rust axios setinterval tauri
1个回答
1
投票

请提供最小的可重现代码,以便我们查看。一旦你这样做,我会更新这个答案。

情侣注意事项:

  • Tauri 使用字符串(和 JSON)格式序列化 JavaScript 和 Rust 之间发送的数据。无二进制格式。
  • axios总是需要额外的时间来发送请求
  • 根据操作系统的不同,执行 JavaScript 的 Web 浏览器可能具有较低的执行优先级(甚至进入睡眠状态以节省能源等)
  • 如果优先考虑将这些请求发送到后端,那么请考虑从 Rust 发送它们(即 reqwest 和其他库)
© www.soinside.com 2019 - 2024. All rights reserved.