Erlang 并发编程

2024-04-15 05:38
文章标签 并发 编程 erlang

本文主要是介绍Erlang 并发编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

并发原语

% 创建一个新的进程
Pid = spawn(Fun).
% 向进程发送消息
Pid ! Message.
% 接收一个发送给当前进程的消息
receive ... and.

一个简单的例子

%% area_server.erl
-module(area_server).  
-export([loop/0]). loop() ->receive{rectangle, Width, Ht} -> io:format("Area of rectangle is ~p~n",[Width * Ht]),loop();{circle, R} -> io:format("Area of circle is ~p~n", [3.14159 * R * R]),loop();Other ->io:format("I don't know what the area of a ~p is ~n",[Other]),loop()end.%% cmd
1> c(area_server).
{ok,area_server}
2> Pid = spawn(fun area_server:loop/0).
<0.66.0>
3> Pid ! {rectangle,6,10}.
Area of rectangle is 60
{rectangle,6,10}
4> Pid ! {circle,23}.
Area of circle is 1661.90111
{circle,23}
5> Pid ! {triangle,2,4,5}.
I don't know what the area of a {triangle,2,4,5} is 
{triangle,2,4,5}

客户端服务器介绍

%% area_server_final.erl
-module(area_server_final).  
-export([start/0, area/2]). start() -> spawn(fun loop/0).area(Pid, What) ->rpc(Pid, What).rpc(Pid, Request) ->Pid ! {self(), Request},receive{Pid, Response} ->Responseend.loop() ->receive{From, {rectangle, Width, Ht}} -> From ! {self(), Width * Ht},loop();{From, {circle, R}} -> From !  {self(), 3.14159 * R * R},loop();{From, Other} ->From ! {self(), {error,Other}},loop()end.%% cmd
1> c(area_server_final).
{ok,area_server_final}
2> Pid = area_server_final:start().
<0.66.0>
3> area_server_final:area(Pid,{rectangle,10,8}).
80
4> area_server_final:area(Pid,{circle,4}).      
50.26544

创建一个进程需要花费多少时间

%% processes.erl
-module(processes).
-export([max/1]).max(N) ->Max = erlang:system_info(process_limit),io:format("Maximum allowed processes:~p~n",[Max]),statistics(runtime),statistics(wall_clock),L = for(1, N, fun() -> spawn(fun() -> wait() end) end),{_, Time1} = statistics(runtime),{_, Time2} = statistics(wall_clock),lists:foreach(fun(Pid) -> Pid ! die end, L),U1 = Time1 * 1000 / N,U2 = Time2 * 1000 / N,io:format("Process spawn time=~p (~p) microseconds~n",[U1, U2]).wait() ->receivedie -> voidend.for(N, N, F) -> [F()];
for(I, N, F) -> [F()|for(I+1, N, F)].%% cmd
1> c(processes).
{ok,processes}
2> processes:max(20000).
Maximum allowed processes:262144
Process spawn time=2.5 (4.4) microseconds
ok%% cmd
% 设置进程数创建上限为 50000
# erl -P 50000
1> processes:max(50000).
Maximum allowed processes:262144
Process spawn time=1.4 (2.08) microseconds
ok

带超时的 receive

%% stimer.erl
-module(stimer).
-export([start/2, cancel/1]).start(Time, Fun) -> spawn(fun() -> timer(Time, Fun) end).cancel(Pid) -> Pid ! cancel.timer(Time, Fun) ->receivecancel ->voidafter Time ->Fun()end.%% cmd
1> c(stimer).
{ok,stimer}
2> Pid = stimer:start(5000, fun()->io:format("timer event~n")end).
<0.66.0>
timer event
3> Pid1 = stimer:start(25000, fun()->io:format("timer event~n")end).
<0.68.0>
4> stimer:cancel(Pid1).
cancel

注册进程

%% clock.erl
-module(clock).
-export([start/2, stop/0]).start(Time, Fun) -> register(clock, spawn(fun() -> tick(Time, Fun) end)).stop() -> clock ! stop.tick(Time, Fun) ->receivestop ->voidafter Time ->Fun(),tick(Time, Fun)end.%% cmd
1> c(clock).
{ok,clock}
2> clock:start(5000, fun()->io:format("TICK ~p~n",[erlang:now()])end).
true
3> TICK {1508,672936,54000}
3> TICK {1508,672941,85000}
3> TICK {1508,672946,85000}
3> clock:stop().
stop

作者 Github : tojohnonly , 博客 : EnskDeCode

这篇关于Erlang 并发编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904969

相关文章

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同