最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

以并行单元执行javascript函数

运维笔记admin8浏览0评论

以并行单元执行javascript函数

以并行单元执行javascript函数

问题被这样正式化。

我们可以在javascript的另一个线程中调用非纯函数并获得Promise吗?

此功能的一种可能的实现是。

function executeAsync(f: function, ...args);

1. Javascript runtime spawns 1 parallel unit (thread, coroutine, etc).

2. Javascript runtime executes the function f in parallel. (Ignore data race issue, maybe add mutex later)

3. After the parallel unit has done its job. Remove the parallel unit from the pool and resolve the Promise. (put callback into the callback queue)

如果仍有疑问,请发表评论。谢谢

参考

我实现的下面的代码起着类似的作用,但不适用于非纯函数它使用safe-eval节点模块来评估字符串并转换为javascript函数

const {isMainThread, Worker, workerData, parentPort} = require("worker_threads");
const {safeEval} = require("safe-eval");
if (isMainThread) {
  // functionObject must be pure function
  module.exports = {executeAsync: function(functionObject = function(...paramsObject) {return undefined;}, ...paramsObject) {
    return new Promise(function(resolve, reject) {
      const worker = new Worker(__filename, {
        workerData: {
          functionString: functionObject.toString(),
          argumentsObject: paramsObject,
        }
      });
      worker.on("message", resolve);
      worker.on("error", reject);
      worker.on("exit", function(functionObject) {
        if (functionObject != 0) {
          reject(new Error(`Worker stopped with code ${functionObject}`));
        }
      });
    });
  }};
} else {
  const {functionString, argumentsObject} = workerData;
  const functionObject = safeEval(functionString);
  parentPort.postMessage(functionObject(...argumentsObject));
}
回答如下:

JavaScript的一种特殊方法是将该函数放入executeAsync函数中,它返回一个承诺供我们以后使用。

这是一个常见的误解。承诺不会做出同步异步的事情。它们只是observe异步的[[observe的标准化方法。它们本身提供的唯一异步行为是,当您通过.then(或.catch.finally)注册处理程序时,可以确保即使不是已承诺,也将异步,而不是同步地调用该处理程序。安顿下来。即使这样,它也是asynchronous,而不是parallel。回调发生在同一线程上,稍后。

在基于浏览器的JavaScript中真正进行并行处理的唯一方法是使用web workers,Node.js的工作人员以此为模型。如您所说,

多数

表示您必须为将在工作程序中运行的代码创建一个单独的文件,尽管it is possible to use a string。
¹“唯一的方式”-好的,技术上分开的独立选项卡可能最终在不同的线程中运行,但前提是它们是完全独立创建的。如果一个选项卡打开另一个选项卡,则它们将共享相同的线程,因为它们每个都引用另一个。
发布评论

评论列表(0)

  1. 暂无评论