greenlet是一个将异步函数移动到自己的线程中的库。
import greenlet from 'greenlet'
let get = greenlet(async url => {
// This will run in worker
let res = await fetch(url)
return await res.json()
})
console.log(await get('/foo'));
我听说如果我获取主线程并解析工作者,性能将非常好。所以我尝试了类似
的东西let parseInWorker = greenlet(res => new Response(res).json())
let get = async url => {
let res = await fetch(url)
return parseInWorker(res)
}
但我总是得到错误:DataCloneError:无法克隆响应对象。我尝试所有解决方案,如:
let clonedRes = res.clone()
let clonedRes = JSON.parse(JSON.stringify(res))
let clonedRes = Object.assign({}, res)
但没有任何作用。
任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
首先
我听说如果我获取主线程并解析为worker, 表现会很好
不是很正确,从工作人员那里发送一些东西,然后从工人那里回来会产生一些成本,所以需要对其进行评估,以考虑是否有额外的性能优势。
其次,当您向工作人员发送数据并从工作人员返回主线程时,将使用structured cloning algorithm对其进行序列化。并非所有内容都可以使用此算法进行序列化。我怀疑Response也可以序列化,因为它包括流。即使这样,将响应发送给Web worker也不会在这种特殊情况下为您提供任何优势