许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  API命名空间(Namespace zone)详解

API命名空间(Namespace zone)详解

阅读数 7
点赞 0
article_banner


Table of Contents

  • Introduction Multiple workers vs Multiple zones Zone types Zone operations
  • API create(id: string, settings: ZoneSettings = DEFAULT_SETTINGS): Zone get(id: string): Zone current: Zone node: Zone Interface ZoneSettings settings.workers: number Object DEFAULT_SETTINGS: ZoneSettings Interface Zone zone.id: string zone.broadcast(code: string): Promise zone.broadcast(function: (...args: any[]) => void, args?: any[]): Promise zone.execute(moduleName: string, functionName: string, args?: any[], options?: CallOptions): Promise zone.execute(function: (...args[]) => any, args?: any[], options?: CallOptions): Promise Interface CallOptions options.timeout: number Interface Result result.value: any result.payload: string result.transportContext: transport.TransportContext

概述

napajs实现了JS世界中的多线程,zone是napajs中重要的概念,它是逻辑上运行特定任务的一组对称的worker。

注意:这里的区域(zone)不同于在Dart、Angular中异步调用的上下文对象,也不同于TC39(技术委员会39)的提议。

多worker vs 多区域(zone)

zone由一个或者多个JavaScript组成,每个线程被称为一个worker。同一个zone里的worker是幂等的(对等的),也就是说在该zone里的任意一个worker上执行返回相同的结果,而且从长远来看,每一个worker的内部状态应该相同。

同一个进程中可以同时存在多个zone,每个zone载入不同的代码,呈现不同的状态或者应用不同的策略,例如堆的大小等。存在多个zone的目的是允许执行多角色的复杂任务,每个角色加载供自身使用的最少的资源。

Zone types

有两种类型的zone:

  • Napa zone - 由管理JavaScript workers(V8隔离)的Napa.js组成的zone。Napa zone可以有多个,每个zone包含多个worker。Napa zone的worker支持部分的Node.JS APIs。
  • Node zone - 一个暴露了 Node.js event loop 的虚拟 zone,它支持全部的Node.js的功能。

Zone operations

在zone上可以执行两种操作:

  1. Broadcast - 在所有的worker上执行可以改变worker状态的代码,返回一个promise对象。通过promise,我们仅能知道操作是否成功。通常,我们使用broadcast来启动应用程序、预加载对象或者改变应用设置。
  2. Execute - 在一个随机的worker上执行不会改变worker状态的程序,返回一个包含结果的promise。Execute 用于实现实际的的业务

API

create(id: string, settings: ZoneSettings): Zone

根据字符类型的id创建一个Napa zone。如果该id的zone已经存在,会抛错。ZoneSettings能设置创建的zone。


例如1:创建一个id为‘zone1’的zone,使用默认设置。

var napa = require('napajs');var zone1 = napa.zone.create('zone1');

例如2:创建一个id为‘zone2’的zone,包含一个worker。

var zone2 = napa.zone.create('zone2', {    workers: 1});

get(id: string): Zone

该方法通过id获得一个zone的引用。如果该zone不存在,抛错。 例如:

var zone = napa.zone.get('zone1');

current: Zone

该方法返回当前运行的zone的引用。如果正在node下,则返回node zone。 例如:获得当前zone。

var zone = napa.zone.current;

node: Zone

该方法返回node zone的引用,等价于napa.zone.get('node') 例如:

var zone = napa.zone.node;

ZoneSettings的接口

zone的设置在创建是就会指定好。如果没有指定,则使用默认设置DEFAULT_SETTINGS。

settings.workers:number

zone中的worker的数量

DEFAULT_SETTINGS 对象


创建zone时的默认配置:

{    workers: 2}

Zone 接口

在Napa中,zone是执行JS和应用策略的基本概念。可以在简介中找到它的定义。通过Zone API,开发者可以在所有的worker间广播JS代码,或者在某个worker上执行一个方法。当你针对一个zone编程的时候,最好确保该zone内的所有的worker之间是幂等的(对等的),因为我们不能假设一个worker能够自己维持自身的状态。

两个主要的API集合是broadcast和execute,它们都是带有入参的异步的操作。

zone.id:string

该方法可以获得zone的id

zone.broadcast(code:string):Promise

该方法以字符串的形式向所有worker异步广播一个JS代码片段,并得到一个空的Promise句柄返回。如果存在任意一个worker执行该代码段失败,promise句柄会抛出错误。


例如:

var napa = require('napajs');var zone = napa.zone.get('zone1');zone.broadcast('var state = 0;')    .then(() => {        console.log('broadcast succeeded.');    })    .catch((error) => {        console.log('broadcast failed.')    });

zone.broadcast(function:(...args:any[])=>void,args?:any[]):Promise

该方法向所有的worker异步广播一个带有入参的匿名函数,并返回一个空的Promise句柄。如果存在任意一个worker执行该函数失败,句柄promise将会抛错。

*注意:在广播时Napa 函数不支持闭包


例如:

zone.broadcast((state) => {        require('some-module').setModuleState(state)    }, [{field1: 1}])    .then(() => {        console.log('broadcast succeeded.');    })    .catch((error) => {        console.log('broadcast failed:', error)    });

zone.execute(moduleName: string, functionName: string, args?: any[], options?: CallOptions): Promise


通过模块名和函数名在某一worker上异步执行一个函数。入参是可传递的任意JS类型。该方法返回一个名为Result的句柄。不论是不友好的代码、用户异常或者发生超时导致的错误,句柄都会被拒绝。 例如:执行‘foo’模块的‘bar’方法,传入的参数是[1,'hello',{field:1}],使用300ms的延迟。

zone.execute(    'foo',     'bar',     [1, "hello", {field1: 1}],     { timeout: 300 })    .then((result) => {        console.log('execute succeeded:', result.value);    })    .catch((error) => {        console.log('execute failed:', error);    });

zone.execute(function: (...args: any[]) => any, args?: any[], options?: CallOptions): Promise

该方法是在任意一个worker上异步执行一个方法对象。入参是可传递的任意JS类型。该方法返回一个名为Result的句柄。不论是不友好的代码、用户异常或者发生超时导致的错误,句柄都会被拒绝。 在执行方法对象时有一些限制: 方法对象不能访问闭包里的变量 如果函数对象没有指定origin属性,则把当前文件作为origin,origin可以设置 __filename 和 __dirname。(详见transporting functions)


例如:

zone.execute((a: number, b: string, c: object) => {        return a + b + JSON.stringify(c);    }, [1, "hello", {field1: 1}])    .then((result) => {        console.log('execute succeeded:', result.value);    })    .catch((error) => {        console.log('execute failed:', error);    });

输出:

execute succeeded: 1hello{"field1":1}

下面的例子说明了当执行异步函数时如何访问 __filename:

// File: /usr/file1.jszone.execute(() => { console.log(__filename);});

输出:

/usr/file1.js

回调操作接口

zone.execute的回调函数操作接口

options.timeout: number

超时时间为毫秒,默认值0表示没有延迟。

Result 接口

访问execute返回结果的接口

result.value:any

result.value是被zone.execute和zone.executeSync调用的函数返回的JavaScript值。Napa在不同的worker之间编组/解组可传递的值。解组发生在第一次查询result.value时。


例如:

var value = result.value;

result.payload: string

result.payload是返回值编组的载荷(以JSON的形式)。该接口使用户可以在不需要解组的地方将结果传递给它的调用者。



例如:

var payload = result.payload;

result.transportContext: transport.TransportContext


TransportContext是指要求将result.payload解组成result.value。

例如:

var napa = require('napajs');var zone = napa.zone.create('zone1');zone.execute(() => { return 0; }, [])    .then((result) => {        // Manually marshall.        var transportContext = result.transportContext;        var value = napa.transport.unmarshall(result.payload, result.transportContext);         // result.value and manual unmarshall from payload are the same.        assert.equal(value, result.value);    });


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空