- 浏览: 27228 次
- 性别:
- 来自: 广州
最新评论
原英文文档:http://www.erlang.org/erldoc?q=&x=0&y=0
Tips:看到网页右边的搜索功能了么,保存这个实用网页吧。
一个实现事件处理功能行为模块,可以动态的删除和增加任意数量事件的事件管理器(event_manager),事件管理器使用这个模块将实现一套标准的接口功能,包括跟踪和错误报告功能。同样他也适合OTP 监控树(supervision tree)
每个事件处理程序被实现为一个回调模块导出一组预定义的功能:
每一个事件处理程序都是一个回调模块,一个事件管理器必可以动态的增加和删除事件回调,所以gen_event 会比其它behaviours(gen_server,gen_fsm)容错更新好,如果安装好的事件处理回调失败(fails with Reason or returns a bad value Term),这个事件管理器是不会失败的,他会删除这个事件回调,并调用对应事件的terminate/2.如果给的参数如:{error,{'EXIT',Reasion}} or {error,Term},其它事件是不会受到影响的。
事件管理不会自动处理(trap)exit signals,%%手动调用 process_flag(trap_exit, true).
如果事件管理器回调返回值里面hibernation有可以进入休眠状态(hibernation),这对于长期处于空闲状态的server来说非常好,不过此特性会使用2个垃圾回收器(when hibernating and shortly after waking up),不适合处理非常多的事件管理器。只要其中一个事件处理返回hibernate就会使event manager进入休眠状态。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
创建一个事件管理器进程(event_manager)这个函数会被supervisor调用创建,保证event_manager与supervisor相连接(link),
如果EventMrName={local,Name},event manager 会像用register/2注册一样本地注册。
如果EventMrName={global,GlobalName},event manager 会像用global:register_name/2注册一样本地注册。
如果不提供Name就不会注册。
如果EventMrName = {via,Module,ViaName} event manager会使用Module里面自己定义的register_name/2,unregister_name/1,whereis_name/1 and send/2,这些函数的功能和global里面功能一致,否则{via,Module,ViaName}无用
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
创建一个独立的event manager 进程,例如没有监控树,其它参见start_link/0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a
给event manager 增加一个新的事件回调(event handler),会调用Module:init/1来初始化他的状态
EventMgr 参数可以:pid(),Name,{Name,Node}(如果这个事件管理注册在其它节点上){global,GlobalName}{via,Module,ViaName}
Args 参数是传给Module:init/1使用的
如果Module:init/1返回一个正确的值,event manager会增加event handler,此函数也会返回ok.
如果Module:init/1带Reason的失败或返回{error,Reasion} 这具event hander会被忽略,此函数会返回{'EXIT',Reason}或{error,Reason}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
和add_handler/3一样添加一个event handler,但会在event handler 和被调用的进程之间添加监控连接(supervise ther connection),
如果这个进程terminateswith Reason event manager 会用Module:terminate/2 {stop,Reason} 把这个event handler 删除
如果event handler 被删除,event manager 会发{gen_event_EXIT,Handler,Reason}给进程(the calling process):这时的Reason会有以下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
向已增加在event manager里面所有的event handler都发一个Event(MSG).event manager会调用所有的event handler的Module:handler_event/2.
notify 是异步的:在消息发出后立即返回,sync_notify同步的,会在所有的event_handler处理完消息后返回ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
一个同步call(和gen_server:call差不多)不过会指定对应的Hander来处理Request.Handler内使用handler_call/2来处理Request.
TimeOut 是一个比0大的毫秒级或infinity.默认值为50000ms.如果规定时间内没有返回,就会call fails.
Repeal会返回Module:handle_call/2返回,如果 event handler没有安装,会返回{error,bad_module}.callback会分别返回Reason Term ,这个函数就会返回{error,{'EXIT',Reason},{error,Term}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
删除event manager(EvenMgrRef)里面对应的Handler,调用Handler:terminate(Args,State).来终结这个事件.
Result:返回Handler:terminate(Args,State)的返回值,如果没有找到安装的事件返回{error,module_not_found}.
如果失败了就会回调返回Reason.此函数返回:{'EXIT',Reason}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
在event manager (EventMgrRef)用Handler1代替Handler2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
与swap_handler/3一致,但是会Handler2和the calling process里面建立连接.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
返回event manager的事件Event handler列表
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
terminates the event manager 在此之前会对安装好的事件调用Module:terminate(stop,...).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
event handler里面的callback函数
当一个新的event handler被加入event manager时,这个函数会被调用.
调用gen_event:add_sup_handler/3,swap_handler/3 swap_sup_handler
返回{ok,State,hibernate}时event manager会进入休眠状态:等待下次事件发生
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
当event manager收到用notify/2或sync_notify/2发送的消息时会调用:所有安装过的事件的Handler:handler_event/2
返回{swap_handler,Args1,NewState,Handler2,Args2}时会调用Term = Module:terminate(Args1,NewState),Module2:init(Args2,Term) 【基本和swap_handler/3相同】
返回remove_handler 时会调用Module:terminate(remove_handler,State).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
使用gen_event:call/3发出的信息,与handle_event类似,不过是同步的。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
收到除用gen_event:call/3,gen_event:notify/3,gen_event:sync_notify/3之外的任何消息。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
在要完成删除,清理工作时会调用。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
更新版本用,这个一直不懂,反正现在没人用到
Tips:看到网页右边的搜索功能了么,保存这个实用网页吧。
一个实现事件处理功能行为模块,可以动态的删除和增加任意数量事件的事件管理器(event_manager),事件管理器使用这个模块将实现一套标准的接口功能,包括跟踪和错误报告功能。同样他也适合OTP 监控树(supervision tree)
每个事件处理程序被实现为一个回调模块导出一组预定义的功能:
每一个事件处理程序都是一个回调模块,一个事件管理器必可以动态的增加和删除事件回调,所以gen_event 会比其它behaviours(gen_server,gen_fsm)容错更新好,如果安装好的事件处理回调失败(fails with Reason or returns a bad value Term),这个事件管理器是不会失败的,他会删除这个事件回调,并调用对应事件的terminate/2.如果给的参数如:{error,{'EXIT',Reasion}} or {error,Term},其它事件是不会受到影响的。
事件管理不会自动处理(trap)exit signals,%%手动调用 process_flag(trap_exit, true).
如果事件管理器回调返回值里面hibernation有可以进入休眠状态(hibernation),这对于长期处于空闲状态的server来说非常好,不过此特性会使用2个垃圾回收器(when hibernating and shortly after waking up),不适合处理非常多的事件管理器。只要其中一个事件处理返回hibernate就会使event manager进入休眠状态。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
start_link() -> Result start_link(EventMgrName) -> Result Types:EventMgrName = {local,Name} | {global,GlobalName} | {via,Module,ViaName} Name = atom() GlobalName = ViaName = term() Result = {ok,Pid} | {error,{already_started,Pid}} Pid = pid()
创建一个事件管理器进程(event_manager)这个函数会被supervisor调用创建,保证event_manager与supervisor相连接(link),
如果EventMrName={local,Name},event manager 会像用register/2注册一样本地注册。
如果EventMrName={global,GlobalName},event manager 会像用global:register_name/2注册一样本地注册。
如果不提供Name就不会注册。
如果EventMrName = {via,Module,ViaName} event manager会使用Module里面自己定义的register_name/2,unregister_name/1,whereis_name/1 and send/2,这些函数的功能和global里面功能一致,否则{via,Module,ViaName}无用
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
start() -> Result start(EventMgrName) -> Result Types: EventMgrName = {local,Name} | {global,GlobalName} | {via,Module,ViaName} Name = atom() GlobalName = ViaName = term() Result = {ok,Pid} | {error,{already_started,Pid}} Pid = pid()
创建一个独立的event manager 进程,例如没有监控树,其它参见start_link/0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a
add_handler(EventMgrRef, Handler, Args) -> Result Types: EventMgr = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid() Name = Node = atom() GlobalName = ViaName = term() Handler = Module | {Module,Id} Module = atom() Id = term() Args = term() Result = ok | {'EXIT',Reason} | term() Reason = term()
给event manager 增加一个新的事件回调(event handler),会调用Module:init/1来初始化他的状态
EventMgr 参数可以:pid(),Name,{Name,Node}(如果这个事件管理注册在其它节点上){global,GlobalName}{via,Module,ViaName}
Args 参数是传给Module:init/1使用的
如果Module:init/1返回一个正确的值,event manager会增加event handler,此函数也会返回ok.
如果Module:init/1带Reason的失败或返回{error,Reasion} 这具event hander会被忽略,此函数会返回{'EXIT',Reason}或{error,Reason}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
add_sup_handler(EventMgrRef, Handler, Args) -> Result Types: EventMgr = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid() Name = Node = atom() GlobalName = ViaName = term() Handler = Module | {Module,Id} Module = atom() Id = term() Args = term() Result = ok | {'EXIT',Reason} | term() Reason = term()
和add_handler/3一样添加一个event handler,但会在event handler 和被调用的进程之间添加监控连接(supervise ther connection),
如果这个进程terminateswith Reason event manager 会用Module:terminate/2 {stop,Reason} 把这个event handler 删除
如果event handler 被删除,event manager 会发{gen_event_EXIT,Handler,Reason}给进程(the calling process):这时的Reason会有以下:
- 1)normal ----使用delete_handler/3或remove_handler
- 2)shutdown ---event_manager 终结了:is terminating
- 3){swapped,NewHandler,Pid} 如果使用swap_handler/3或swap_sup_handler/3替换原event handler
- 4)一个term如果由于一个错误被移除
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
notify(EventMgrRef, Event) -> ok sync_notify(EventMgrRef, Event) -> ok Types: EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid() Name = Node = atom() GlobalName = ViaName = term() Event = term()
向已增加在event manager里面所有的event handler都发一个Event(MSG).event manager会调用所有的event handler的Module:handler_event/2.
notify 是异步的:在消息发出后立即返回,sync_notify同步的,会在所有的event_handler处理完消息后返回ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
call(EventMgrRef, Handler, Request) -> Result call(EventMgrRef, Handler, Request, Timeout) -> Result Types: EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid() Name = Node = atom() GlobalName = ViaName = term() Handler = Module | {Module,Id} Module = atom() Id = term() Request = term() Timeout = int()>0 | infinity Result = Reply | {error,Error} Reply = term() Error = bad_module | {'EXIT',Reason} | term() Reason = term()
一个同步call(和gen_server:call差不多)不过会指定对应的Hander来处理Request.Handler内使用handler_call/2来处理Request.
TimeOut 是一个比0大的毫秒级或infinity.默认值为50000ms.如果规定时间内没有返回,就会call fails.
Repeal会返回Module:handle_call/2返回,如果 event handler没有安装,会返回{error,bad_module}.callback会分别返回Reason Term ,这个函数就会返回{error,{'EXIT',Reason},{error,Term}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
delete_handler(EventMgrRef, Handler, Args) -> Result Types: EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid() Name = Node = atom() GlobalName = ViaName = term() Handler = Module | {Module,Id} Module = atom() Id = term() Args = term() Result = term() | {error,module_not_found} | {'EXIT',Reason} Reason = term()
删除event manager(EvenMgrRef)里面对应的Handler,调用Handler:terminate(Args,State).来终结这个事件.
Result:返回Handler:terminate(Args,State)的返回值,如果没有找到安装的事件返回{error,module_not_found}.
如果失败了就会回调返回Reason.此函数返回:{'EXIT',Reason}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
swap_handler(EventMgrRef, {Handler1,Args1}, {Handler2,Args2}) -> Result Types: EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid() Name = Node = atom() GlobalName = ViaName = term() Handler1 = Handler2 = Module | {Module,Id} Module = atom() Id = term() Args1 = Args2 = term() Result = ok | {error,Error} Error = {'EXIT',Reason} | term() Reason = term()
在event manager (EventMgrRef)用Handler1代替Handler2
- 1)删除Handler1-----与调用delete_handler一致:
- 2)增加Handler2-----与调用add_handler一致:【init里面调用{Args2,Term}:Term是Handler1:terminate里面返回的】
- 3)这2个操作没有原子性,1,2的成功没有关系的。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
swap_sup_handler(EventMgrRef, {Handler1,Args1}, {Handler2,Args2}) -> Result Types: EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid() Name = Node = atom() GlobalName = ViaName = term() Handler1 = Handler 2 = Module | {Module,Id} Module = atom() Id = term() Args1 = Args2 = term() Result = ok | {error,Error} Error = {'EXIT',Reason} | term() Reason = term()
与swap_handler/3一致,但是会Handler2和the calling process里面建立连接.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
which_handlers(EventMgrRef) -> [Handler] Types: EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid() Name = Node = atom() GlobalName = ViaName = term() Handler = Module | {Module,Id} Module = atom() Id = term()
返回event manager的事件Event handler列表
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
stop(EventMgrRef) -> ok Types: EventMgrRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid() Name = Node = atom() GlobalName = ViaName = term()
terminates the event manager 在此之前会对安装好的事件调用Module:terminate(stop,...).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
event handler里面的callback函数
Module:init(InitArgs) -> {ok,State} | {ok,State,hibernate} | {error,Reason} Types: InitArgs = Args | {Args,Term} Args = Term = term() State = term() Reason = term()
当一个新的event handler被加入event manager时,这个函数会被调用.
调用gen_event:add_sup_handler/3,swap_handler/3 swap_sup_handler
返回{ok,State,hibernate}时event manager会进入休眠状态:等待下次事件发生
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Module:handle_event(Event, State) -> Result Types: Event = term() State = term() Result = {ok,NewState} | {ok,NewState,hibernate} | {swap_handler,Args1,NewState,Handler2,Args2} | remove_handler NewState = term() Args1 = Args2 = term() Handler2 = Module2 | {Module2,Id} Module2 = atom() Id = term
当event manager收到用notify/2或sync_notify/2发送的消息时会调用:所有安装过的事件的Handler:handler_event/2
返回{swap_handler,Args1,NewState,Handler2,Args2}时会调用Term = Module:terminate(Args1,NewState),Module2:init(Args2,Term) 【基本和swap_handler/3相同】
返回remove_handler 时会调用Module:terminate(remove_handler,State).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Module:handle_call(Request, State) -> Result Types: Request = term() State = term() Result = {ok,Reply,NewState} | {ok,Reply,NewState,hibernate}| {swap_handler,Reply,Args1,NewState,Handler2,Args2}| {remove_handler, Reply} Reply = term() NewState = term() Args1 = Args2 = term() Handler2 = Module2 | {Module2,Id} Module2 = atom() Id = term()
使用gen_event:call/3发出的信息,与handle_event类似,不过是同步的。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Module:handle_info(Info, State) -> Result Types: Info = term() State = term() Result = {ok,NewState} | {ok,NewState,hibernate} | {swap_handler,Args1,NewState,Handler2,Args2} | remove_handler NewState = term() Args1 = Args2 = term() Handler2 = Module2 | {Module2,Id} Module2 = atom() Id = term()
收到除用gen_event:call/3,gen_event:notify/3,gen_event:sync_notify/3之外的任何消息。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Module:terminate(Arg, State) -> term() Types: Arg = Args | {stop,Reason} | stop | remove_handler | {error,{'EXIT',Reason}} | {error,Term} Args = Reason = Term = term()
在要完成删除,清理工作时会调用。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Module:code_change(OldVsn, State, Extra) -> {ok, NewState} Types: OldVsn = Vsn | {down, Vsn} Vsn = term() State = NewState = term() Extra = term()
更新版本用,这个一直不懂,反正现在没人用到
发表评论
-
Erlang 简单的节点互连
2014-03-19 23:41 485自己写的游戏跨服初步构架,以后再一点点完善,先记下时间线哈。 ... -
简单erlang节点互连实验
2014-03-10 15:53 686如果erlang:节点test1,test2互连接: 1.节点 ... -
Erlang OTP gen_event (1)
2014-02-26 15:06 1011演示gen_event的运行过程: mod_event_ma ... -
erlang efficient guide 3
2013-08-19 22:19 1056* 3 Common Caveats * 3常见 ... -
erlang efficient guide 2
2013-08-18 01:02 8272 The Eight Myths of Erlang Per ... -
fun还是如以前一样狂跩吊么?
2013-08-16 22:26 583fun这么好用。为什么老大在最近都说不要用? gen:cal ... -
emacs 的erlang-flymake
2013-08-14 15:15 1415emacs 设置erlang-flymake erlang- ... -
erlang ets
2013-07-22 23:08 1789参见:http://www.cnblogs.com ... -
erlang的编程规范
2013-03-26 17:17 1881Programming Rules and Conventio ... -
Erlang------Mnesia
2013-03-25 12:49 1658读erlang编程指南Mnesia笔记: 1.mnesia 是 ... -
进程环
2013-03-18 16:48 779编写一个程序,它生成N ... -
匿名函数fun
2012-12-15 16:12 768lists:map(fun/1,[1,2,3]). 小试匿名函 ... -
并发编程实战otp--open telecom platform 二
2012-10-10 23:17 1106第二章:Erlang语言精要。 shell 的启动参数h ... -
并发编程实战otp--open telecom platform 一
2012-10-10 23:16 11521.erlang 的进程模型: 并发的基本单位是进程, ... -
learn some erlang
2012-10-09 22:54 672Erlang has this very pragm ... -
erlang语句块的简洁使用
2012-09-25 22:48 632begin end语句块的简洁使用:问题描述:将一堆人 ... -
命令式编程语言的标杆
2012-09-25 09:47 642命令式编程语言的标杆: 1.进程必须是语言的核心; 2.任何进 ... -
emacs与erlang的完美结合
2012-09-23 22:48 12341.在emacs中使用c+x c+z 启动erlang she ...
相关推荐
高级色系PPT11.pptx
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
【作品名称】:基于tensorflow的的cnn卷积神经网络的图像识别分类 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。
数据分析是指通过收集、清洗、处理和解释数据,以发现其中的模式、趋势和关联,从而提供决策支持或洞察见解的过程。它在各行各业中都扮演着至关重要的角色,从市场营销到科学研究,从金融领域到医疗保健,都有广泛的应用。
#pip install pandas -i https://mirrors.aliyun.com/pypi/simple #安装pandas处理数据模块 #pip install xlwt -i https://mirrors.aliyun.com/pypi/simple #安装excel模块 #pip install openpyxl #从微信导出对帐帐单 import pandas as pd #引入pandas,重命名为pd,Python3.9.10版本的Pandas无法兼容低版本的xls import numpy as np #导入均值模块 #从第17行读取csv格式的帐单 df = pd.read_csv('微信支付账单(20230101-20230401).csv',header=16) #分析数据 ...... #将分析数据另存为out.xlsx ..... #进行交易进间分析 ...... #统计交易对方 ...... #将结果保存到excel ..... writer.close()
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
作业.docx
DB23∕T 2540-2019 智慧城市建设项目可行性研究报告.pdf
附件是在CentOS系统上安装Docker 步骤,仅供交流学习使用,无任何商业目的! 在执行这些步骤之前,请确保你的CentOS系统已经更新到最新,并且你了解Docker容器技术的相关概念。如果你在安装过程中遇到任何问题,可以查看Docker的官方文档或搜索相关的错误信息。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
蜂群系统链性态网体系化作战矩阵.txt
【资源概览】 高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip高分毕业设计 基于STM32单片机的智能鱼缸设计源代码+原理图+器件清单+实物焊接效果+项目资料齐全.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!
Qt是一套跨平台的C++应用程序开发框架,被广泛应用于开发图形用户界面(GUI)程序、嵌入式系统、移动设备应用等领域。它提供了丰富的类库和工具,使得开发者可以快速构建功能强大、美观易用的应用程序。以下是一个涵盖Qt开发的教程和案例的综合描述。
【资源概览】 高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip高分项目 基于STM32单片机的电子血压计设计源代码+项目资料齐全+教程文档.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
基于深度神经网络的图像分类任务.zip
基于 Flask 发布的深度学习 web 服务.zip
【资源概览】 高分项目 基于STM32F030K6通过该单片机控制各个外设模块的电源控制源代码+项目资料齐全+教程文档.zip高分项目 基于STM32F030K6通过该单片机控制各个外设模块的电源控制源代码+项目资料齐全+教程文档.zip高分项目 基于STM32F030K6通过该单片机控制各个外设模块的电源控制源代码+项目资料齐全+教程文档.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!
【资源概览】 高分项目 基于STM32F103单片机的节能型自适应风扇项目源代码+项目资料齐全+教程文档.zip高分项目 基于STM32F103单片机的节能型自适应风扇项目源代码+项目资料齐全+教程文档.zip高分项目 基于STM32F103单片机的节能型自适应风扇项目源代码+项目资料齐全+教程文档.zip 【资源说明】 高分项目源码:此资源是在校高分项目的完整源代码,经过导师的悉心指导与认可,答辩评审得分高达95分,项目的质量与深度有保障。 测试运行成功:所有的项目代码在上传前都经过了严格的测试,确保在功能上完全符合预期,您可以放心下载并使用。 适用人群广泛:该项目不仅适合计算机相关专业(如电子信息、物联网、通信工程、自动化等)的在校学生和老师,还可以作为毕业设计、课程设计、作业或项目初期立项的演示材料。对于希望进阶学习的小白来说,同样是一个极佳的学习资源。 代码灵活性高:如果您具备一定的编程基础,可以在此代码基础上进行个性化的修改,以实现更多功能。当然,直接用于毕业设计、课程设计或作业也是完全可行的。 欢迎下载,与我一起交流学习,共同进步!
本文对养老保险管理系统管理系统的设计与实现分成六个章节来说明。 第1章:研究养老保险管理系统管理系统的背景,以及开发养老保险管理系统管理系统的意义。 第2章:对开发养老保险管理系统管理系统的环境还有技术进行说明。 第3章:分析养老保险管理系统管理系统的可行性,性能,流程以及功能。 第4章:设计养老保险管理系统管理系统的功能结构,设计数据库E-R图以及对数据表的存储结构进行设计。 第5章:实现养老保险管理系统管理系统的功能并进行功能界面展示。 第6章:对系统测试进行阐述,以及对本系统部分功能进行检测。 本课题研发的养老保险管理系统管理系统,就是提供养老保险管理系统信息处理的解决方案,它可以短时间处理完信息,并且这些信息都有专门的存储设备,而且数据的备份和迁移都可以设定为无人值守,从人力角度和信息处理角度以及信息安全角度,养老保险管理系统管理系统是完胜传统纸质操作的。 感兴趣查看目录大纲,下载学习!