动态加载代码erlang

本文介绍了Erlang中动态加载代码的概念,通过创建进程A并远程调用来实现。以event_handler作为服务器,motor_controller作为回调模块,通过发送不同消息来执行不同功能。动态加载代码时,可以通过改变接收到的消息类型,更新执行的函数,从而实现代码的动态更新。此技术能够实现强大的功能,例如在不重启进程的情况下更改模块的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       动态加载代码,个人理解就是另外开一条进程A,初始化的时候,远程调用,发送一个函数f1发送过去,然后一直保持receive ,阻塞状状态。

        举例说明

 event_handler 为事件处理,可以理解为服务器,可以动态加载代码。

-module(event_handler).
-compile(export_all).



make(Name) ->
	register(Name,spawn(fun() -> my_handler(fun no_op/1) end)).



my_handler(Fun) ->
	receive
		{add,Fun1} ->
			my_handler(Fun1);
		{event,Any} ->
			(catch Fun(Any)),
			my_handler(Fun)
	end.

no_op(_) ->void.

add_handler(Name,Fun) ->
	Name ! {add,Fun}.

event(Name,X) ->Name ! {event , X}.


   motor_controller 为回调模块

-module(motor_controller).
-compile(export_all).


add_event_handler() ->
	event_handler:add_handler(errors,fun controller/1).

controller(too_hot) ->
	io:format("Turn off the motor~n");
controller(X)	->
	io:format("~w ignored event:~p~n",[?MODULE,X]).
编译后执行


加载代码,执行函数


很简单的代码,但是确实可以实现很强大的功能。

event_handler:make(errors) 

这句分裂了一个进程A,且注册到了erlang的节点上,且传入了函数no_op,进程A在receive处阻塞。这个时候可以有两种选择

      

        1. event(Name,X) ->Name ! {event , X}. 则可以发信息{event,hi}给A进程, A进程收到信息则不会再阻塞,执行no_op函数。

        2.调用add_handler(Name,X) 方法,则可以发信息{add,fun controller/1}给A进程 ,A进程收到消息,匹配到了

{add,Fun1} ,则Fun1作为  myhandler的参数执行 myhandler(Fun1) ,再次回到了received的阻塞状态。这样一来就完成了动态代码加载。


如果是执行了2,event(Name,X) 这个里面的代码就换成了新的motor_controller里的代码了,


所以才会输出这一句。


如果不对,请指出批评。谢谢。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值