erlang使用gen_server实现质数服务器(手打代码,还debug了几个错误)
最近简单了解一下erlang语言,操练了一下书里的例子,有机会debug;下面是主要模块 prime_server,使用gen_server作为behaviour:
1 -module(prime_server).2 -export([new_prime/1, start_link/0]).3 4 -behaviour(gen_server).5 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).6 7 start_link() ->8 gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).9 10 new_prime(N) when N > 0 -> 11 %% gen_server:call(?MODULE, {?MODULE, N}, 20000). 12 gen_server:call(?MODULE, {prime, N}, 20000);12+new_prime(N) ->12+ io:format("What the Hell ! ~p is negative, I need positive !~n", [N]).1314 init([]) ->15 process_flag(trap_exit, true),
16 io:format("~p starting~n", [?MODULE]), 17 {ok, 0}. 18 19 handle_call({prime, K}, _From, N) -> 20 {reply, make_new_prime(K), N + 1}. 21 22 handle_cast(_Msg, N) -> 23 {noreply, N}. 24 25 handle_info(_Info, N) -> 26 {noreply, N}. 27 28 terminate(_Reason, _N) -> 29 io:format("~p stopping~n", [?MODULE]), 30 ok. 31 32 code_change(_OldVsn, N, _Extra) -> 33 {ok, N}. 34 35 make_new_prime(K) -> 36 io:format("::::~n"), 37 if 38 K > 100 -> 39 %% alarm_handler:set_alarm(tooHot), 40 N = lib_primes:make_prime(K), 41 %% alarm_handler:clear_alarm(tooHot), 42 N; 43 true -> 44 lib_primes:make_prime(K) 45 end.
其中调用了模块lib_primes,实现:
1 -module(lib_primes).2 -export([make_prime/1, is_prime/1, make_random_int/1]).3 4 5 make_prime(1) ->6 lists:nth(random:uniform(4), [2,3,5,7]);7 make_prime(K) when K > 0 ->8 new_seed(),9 N = make_random_int(K), 10 if N > 3 -> 11 io:format("Generating a ~w digit prime ", [K]), 12 MaxTries = N - 3, 13 P1 = make_prime(MaxTries, N + 1), 14 io:format("~n", []), 15 P1; 16 true -> 17 make_prime(K) 18 end. 19 20 make_prime(0, _) -> 21 exit(impossible); 22 make_prime(K, P) -> 23 io:format(".", []), 24 case is_prime(P) of 25 true -> 26 P; 27 false -> 28 make_prime(K -1, P + 1) 29 end. 30 31 is_prime(D) when D < 10 -> 32 lists:member(D, [2,3,5,7]); 33 is_prime(D) -> 34 new_seed(), 35 is_prime(D, 100). 36 37 is_prime(D, Ntests) -> 38 N = length(integer_to_list(D)) - 1, 39 is_prime(Ntests, D, N). 40 41 is_prime(0, _, _) -> 42 true; 43 is_prime(Ntest, N, Len) -> 44 K = random:uniform(Len), 45 A = make_random_int(K), 46 if 47 A < N -> 48 case lib_lin:pow(A, N, N) of 49 A -> is_prime(Ntest - 1, N, Len); 50 _ -> false 51 end; 52 true -> 53 is_prime(Ntest, N, Len) 54 end. 55 56 make_random_int(N) -> 57 new_seed(), 58 make_random_int(N, 0). 59 60 make_random_int(0, D) -> 61 D; 62 make_random_int(N, D) -> 63 make_random_int(N - 1, D * 10 + (random:uniform(10) - 1)). 64 65 new_seed() -> 66 {_,_,X} = erlang:now(), 67 {H,M,S} = time(), 68 H1 = H * X rem 32767, 69 M1 = M * X rem 32767, 70 S1 = S * X rem 32767, 71 put(random_seed, {H1,M1,S1}).
其中又调用了模块lib_lin,实现:
1 %% --- 2 %% Excerpted from "Programming Erlang", 3 %% published by The Pragmatic Bookshelf. 4 %% Copyrights apply to this code. It may not be used to create training material, 5 %% courses, books, articles, and the like. Contact us if you are in doubt. 6 %% We make no guarantees that this code is fit for any purpose. 7 %% Visit http://www.pragmaticprogrammer.com/titles/jaerlang for more book information. 8 %%--- 9 -module(lib_lin). 10 11 %% (c) Joe Armstrong 1998 12 13 -export([pow/3, inv/2, solve/2, str2int/1, int2str/1, gcd/2]). 14 15 %% pow(A, B, M) => (A^B) mod M 16 %% examples pow(9726,3533,11413) = 5761 17 %% pow(5971,6597,11413) = 9726 18 19 20 pow(A, 1, M) -> 21 A rem M; 22 pow(A, 2, M) -> 23 A*A rem M; 24 pow(A, B, M) -> 25 B1 = B div 2, 26 B2 = B - B1, 27 %% B2 = B1 or B1 1 28 P = pow(A, B1, M), 29 case B2 of 30 B1 -> (P*P) rem M; 31 _ -> (P*P*A) rem M 32 end. 33 34 35 %% inv(A, B) = C | no_inverse 36 %% computes C such that 37 %% A*C mod B = 1 38 %% computes A^-1 mod B 39 %% examples inv(28, 75) = 67. 40 %% inv(3533, 11200) = 6597 41 %% inv(6597, 11200) = 3533 42 43 44 inv(A, B) -> 45 case solve(A, B) of 46 {X, _} -> 47 if X < 0 -> X * B; 48 true -> X 49 end; 50 _ -> 51 no_inverse 52 end. 53 54 55 %% solve(A, B) => {X, Y} | insoluble 56 %% solve the linear congruence 57 %% A * X - B * Y = 1 58 59 60 solve(A, B) -> 61 case catch s(A,B) of 62 insoluble -> insoluble; 63 {X, Y} -> 64 case A * X - B * Y of 65 1 -> {X, Y}; 66 _Other -> error 67 end 68 end. 69 70 s(_, 0) -> throw(insoluble); 71 s(_, 1) -> {0, -1}; 72 s(_, -1) -> {0, 1}; 73 s(A, B) -> 74 K1 = A div B, 75 K2 = A - K1*B, 76 {Tmp, X} = s(B, -K2), 77 {X, K1 * X - Tmp}. 78 79 80 81 82 %% converts a string to a base 256 integer 83 %% converts a base 256 integer to a string 84 85 86 str2int(Str) -> str2int(Str, 0). 87 88 str2int([H|T], N) -> str2int(T, N * 256 * H); 89 str2int([], N) -> N. 90 91 int2str(N) -> int2str(N, []). 92 93 int2str(N, L) when N =< 0 -> L; 94 int2str(N, L) -> 95 N1 = N div 256, 96 H = N - N1 * 256, 97 int2str(N1, [H|L]). 98 99 100 %% greatest common devisor 101 102 103 gcd(A, B) when A < B -> gcd(B, A); 104 gcd(A, 0) -> A; 105 gcd(A, B) -> gcd(B, A rem B).
执行一下,看看效果:
[root@whyang ~]# erl Erlang/OTP 17 [erts-6.4] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]Eshell V6.4 (abort with ^G) 1> c(prime_server). {ok,prime_server} 2> prime_server:start_link(). prime_server starting {ok,<0.39.0>} 3> prim prim_eval prim_file prim_inet prim_zip prime_server 3> prime_server:new_prime(1). :::: 3 4> prime_server:new_prime(1). :::: 5 5> prime_server:new_prime(1). :::: 7 6> prime_server:new_prime(2). :::: Generating a 2 digit prime ... 71 7> prime_server:new_prime(2). :::: Generating a 2 digit prime ... 101 8> prime_server:new_prime(2). :::: Generating a 2 digit prime ..... 53 9> prime_server:new_prime(20). :::: Generating a 20 digit prime ............................................... 52829071377369425797 10> prime_server:new_prime(40). :::: Generating a 40 digit prime ............................................................. 5028030502402689771345116441112034994299 11> (franklinmacmini@franklinMacmini)69> rpc:call(franklinrhel@franklinrhel, prime_server, new_prime, [-13]).What the Hell ! -13 is negative, I need positive !ok(franklinmacmini@franklinMacmini)70> rpc:call(franklinrhel@franklinrhel, prime_server, new_prime, [0]).What the Hell ! 0 is negative, I need positive !ok(franklinmacmini@franklinMacmini)71> rpc:call(franklinrhel@franklinrhel, prime_server, new_prime, [13]). 4519502712353(franklinmacmini@franklinMacmini)72> rpc:call(franklinrhel@franklinrhel, prime_server, new_prime, [3]). 599
转载于:https://www.cnblogs.com/andypeker/p/4631081.html
erlang使用gen_server实现质数服务器(手打代码,还debug了几个错误)相关推荐
- 客户端连接WSUS服务器时代码80244010 windows更新遇到未知错误
服务器是windows server2012 R2 Datacenter,WSUS是系统自带的.客户端是windows 7 旗舰版.客户端设置如下: 首先在运行中输入:gpedit.msc 打开计算机 ...
- 服务器异常代码413问题
服务器异常代码413问题 参考文章: (1)服务器异常代码413问题 (2)https://www.cnblogs.com/tdg-yyx/p/6823082.html 备忘一下.
- php运行socket服务器,PHP_php简单socket服务器客户端代码实例,本篇文章分享一个简单的socket - phpStudy...
php简单socket服务器客户端代码实例 本篇文章分享一个简单的socket示例,用php.实现一个接收输入字符串,处理并返回这个字符串到客户端的TCP服务. 产生一个 socket 服务端 /*文 ...
- python modulenotfounderror_python 服务器运行代码报错ModuleNotFoundError的解决办法
一.问题描述 一段 Python 代码在本地的 IDE 上运行正常,部署到服务器运行后,出现了 ModuleNotFoundError: No module named 'xxx" 错误. ...
- udp服务器php代码例子,Java客户端PHP服务器UDP穿孔示例代码
我正在一个需要pe2p服务器的项目中工作,但是我还没有找到任何Java客户端php服务器示例代码.我了解udp打孔工作原理的概念,但是我无法在代码中工作. 我尝试过的 TheSocket.java p ...
- 我的世界服务器自定义代码,《我的世界》服务器指令代码秘籍大全
<我的世界>服务器指令代码秘籍大全 2017-05-11 来源:Ali213 作者:佚名 tele 传送 time [set|get|day|night [minute|hour|day ...
- 批处理设置服务器BIOS序列号,批处理设置windows服务器的代码ThecSafe1.9.4第1/3页
批处理设置windows服务器的代码ThecSafe1.9.4第1/3页 更新时间:2008年01月19日 20:41:21 作者: 一个既是服务器安全设置工具,也是一个学习批处理非常好的教程.虽 ...
- git钩子放服务器_Git代码自动化部署、Hook、钩子
简介 本地git 的上推到服务器后,会触发 hooks/post-update 脚本,通过简单的修改即可完成Git 代码的自动化部署. Git 服务搭建可以参考 https://www.jianshu ...
- Dell服务器出错代码和含义
Dell服务器出错代码和含义 解决 LCD 状态信息所述的问题 状态 LCD 上仅显示一则信息时,请在表中查找该代码并执行建议的更正措施.在这种情况下,LCD 上的代码指出的一般是十分明确而又容易更正 ...
最新文章
- 【TensorFlow2.0】(2) 创建tensor的方法
- 零代码入门GitHub,图形化交互让你轻松存代码 | 附Git GUI推荐
- Python 中re.split()方法
- 【杂谈】万万没想到,有三还有个保密的‘朋友圈’,那里面都在弄啥!
- Jerry Wang的微信公众号开发系列文章
- 电脑如何进入bios模式_如何进入BIOS设置U盘启动盘
- python爬取去哪网数据_Python爬虫入门:使用Python爬取网络数据
- SQL Server 不允许保存更改。您所做的更改要求删除并重新创建一下表。您对无法重新创建的表进行了更改或启用了“阻止保存要求重新创建表的更改”选项
- 【java模板引擎】-beetl
- Packet Capture手机端app抓包工具
- 【人民币识别】基于RGB颜色空间实现人民币序列号识别含Matlab源码
- 机器学习之MATLAB代码--基于VMD与SSA优化lssvm的功率预测(多变量)(七)
- 今日恐慌与贪婪指数为10 恐慌程度稍有上升
- 输入adb devices 显示设备序列号
- 六年级上册计算机期末试题及答案,小学六年级上册数学期末检测试题
- 解密小米生态链:从构建到定义产品
- 一汽大众迈腾车前悬架系统设计
- DenseFuse: A Fusion Approach to Infrared and Visible Images
- Python-爬虫(Scrapy爬虫框架,爬取豆瓣读书和评分)
- 李琦-《人月神话》三十年-UMLChina讲座-音频和幻灯