基于Erlang的并发程序简要

简介: 版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。 https://blog.csdn.net/wireless_com/article/details/44098571

 Erlang中基本的并发函数

1)  Pid =spwan(Mod,Func,Args) 创建一个新的进程来执行apply(Mod,Func,Args),与调用进程并列运行,会使用最新的代码定义模块。

2)  Pid!Message 向Pid进程异步发送Message,!为发送操作符

3)  Receive … end 接收消息

receive

           Pattern1[when Guard1]-> Expression1;

           Pattern2[whenGuard2]->Expression2;

         aftertime->

                   Expressions

         end.

内置函数erlang:system_info(process_limit)可找出所允许的最大进程数,默认为262144.

进程注册的内置函数有:

register(AnAtom,Pid)用名称注册Pid

uregister(AnAtom) 注销关联注册

whereis(AnAtom)->Pid|undefined 检查Pid是否注册

registered()->[AnAtom::atom()]返回系统里所有注册进程的列表。

 

并发程序模板:

-module(ctemplate).

-compile(export_all).

 

start() ->

         Spwan(?MODULE,loop,[]).

 

rpc(Pid,Request) ->

         Pid! {self(),Request},

         receive

                   {Pid,Respone}->

                            Response

         end.

 

loop(X) ->

         receive

                   Any->

                            Io:format(“Received:~p ~n”, [Any]),

                            loop(X)

         end.

 

每当收到消息时会处理它并再次调用loop(),这一过程称为尾递归,无需消耗堆栈空间可以一直循环下去。

 

Erlang并发程序的错误处理建立在远程监测和处理错误的基础上,重点在补救而不是预防,几乎没有防御性代码,只有在错误后清理系统的代码,即让其他进程修复错误和任其崩溃。

 

程序在出错时立即崩溃的优点:

1)  不编写防御性代码,直接崩溃简单

2)  别人来修复

3)  不会使错误恶化

4)  第一时间举旗示意

5)  修复时不担心原因重在清理

6)  简化了系统架构

监视和连接类似,但监视是单向的,如果被监视的进程挂了会向监视进程发一“宕机“消息,而不是退出信号。基本错误处理函数有:

-spec spwan_link(Fun) ->Pid

-spec spwan_monitor(Fun)-> {Pid,Ref}

-spec process_flag(trap_exit,true)

-spec link(Pid) ->true

-spec unlink(Pid) -> true

-spec erlang:monitor(process,Item) ->Ref

-spec exit(Why) -> none()


分布式模型:分布式erlang 和基于socket的分布式模型。分布式erlang运行在可信网络,通常在同一局域网的集群上,并受防火墙保护。基于socket的分布式模型基于TCP/IP不可信网络.

分布式Erlang的主要问题在于客户端可以自行决定在服务器上分裂出多种进程,适合于你拥有全部的机器,并且想在单台机器上控制他们。lib_chan 模块让用户能够显式控制自己的机器分裂出哪些进程。

 

为了在互联网上执行并发程序:

1)  确保4369端口对TCP和UDP都开发,该端口保留给epmd(Erlang端口映射守护进程)

2)  选择1个或一段连续的端口给分布式erlang使用,确保这些端口开放,例如:

$erl  -name …-setcookie …  -kernelinet_dist_listen_min Min \

           Inet_dist_listen_maxMax

Rpc提供了许多远程调用服务,global里的函数可以用来在分布式系统里注册名称以及维护一个全连接的网络。

Erlang集群就是一组带有相同cookie的互连节点。创建cookie的三种方法:

1)  在文件$HOME/.erlang.cookie存放相同的cookie

2)  在Erlang启动时,可以用 –setcookie,例如

$erl  -setcookieABCDEFG2048

3)  内置函数erlang:set_cookie(node(),C)在程序中指定

 

Erlang通过名为端口的对象与外部程序通信,如果想端口发送一个消息,这一消息就会被发往与端口相连的外部程序,来自外部程序的消息会变成来自端口的Erlang消息。创建端口的进程成为端口的相连进程,所有发往端口的消息都必须标明相连进程的PID,所有来自外部程序的消息都会发往相连进程。




目录
相关文章
|
7月前
|
安全 Python
Python中的并发编程:多线程与多进程技术探究
本文将深入探讨Python中的并发编程技术,重点介绍多线程和多进程两种并发处理方式的原理、应用场景及优缺点,并结合实例分析如何在Python中实现并发编程,以提高程序的性能和效率。
|
3月前
|
监控 Java 开发者
【并发编程的终极简化】JDK 22结构化并发:让并发编程变得像写代码一样简单!
【9月更文挑战第8天】随着JDK 22的发布,结构化并发为Java编程带来了全新的并发编程体验。它不仅简化了并发编程的复杂性,提高了程序的可靠性和可观察性,还为开发者们提供了更加高效、简单的并发编程方式。我们相信,在未来的发展中,结构化并发将成为Java并发编程的主流方式之一,推动Java编程语言的进一步发展。让我们共同期待Java在并发编程领域的更多创新和突破!
|
6月前
|
Unix Go 开发者
探索Go语言并发模型:原理与实践
本文深入探讨了Go语言的并发模型,包括其设计原理、Goroutine和Channel的基本使用,以及如何在实际项目中高效地应用这些概念来提高程序的性能和可维护性。
|
6月前
|
并行计算 API Python
Python中的并发编程(1)并发相关概念
Python中的并发编程(1)并发相关概念
|
7月前
|
Python
深入 Python 套接字编程:高级特性与并发处理
【5月更文挑战第18天】本文探讨了Python套接字编程的高级特性,包括非阻塞套接字、超时设置和端口复用,以及并发处理方法:多线程、多进程和异步I/O(如`asyncio`)。通过示例展示了多线程服务器如何处理客户端连接。同时强调并发处理时需注意资源竞争和同步,并合理配置线程数。学习这些技能将有助于构建高效、灵活的网络应用,应对不断发展的技术挑战。
87 10
|
7月前
|
程序员 开发者 Python
Python中的并发编程与多线程技术探究
Python作为一种流行的编程语言,其在并发编程方面有着独特的特点和强大的功能。本文将深入探讨Python中的并发编程技术,重点介绍多线程技术在Python中的应用与实现方式,以及如何利用多线程提高程序的性能和效率。
|
7月前
|
开发者 Python
深入浅出Python协程:提高并发性能的利器
本文旨在深入探讨Python中的协程机制,一种轻量级的并发编程解决方案。与传统的多线程和多进程相比,协程提供了更高效的并发性能,尤其是在I/O密集型应用中。我们将从协程的基本概念入手,解析其工作原理,并通过实例讲解如何在Python中使用协程来优化程序性能。文章还将对比协程与其他并发模型的优缺点,帮助读者全面理解协程在现代软件开发中的应用价值。
59 3
|
7月前
|
开发者 Python
深入浅出Python协程:提高并发编程效率
在现代软件开发中,提高程序的执行效率和响应速度是一个永恸的追求。本文将深入探讨Python协程(Coroutine)的原理及其在并发编程中的应用。与传统的多线程和多进程相比,协程提供了一种更轻量级、成本更低的并发执行方案。我们将通过实例详细说明如何使用Python的asyncio库来编写协程,解析其背后的事件循环机制,并探讨如何通过协程提高程序的并发处理能力,最终达到提高程序执行效率的目的。本文旨在为读者揭示协程技术的魅力,帮助读者掌握使用Python进行高效并发编程的技巧。
30 0
|
7月前
|
开发者 Python
深入浅出Python协程:提高并发性能的秘诀
在现代软件开发中,提高应用程序的并发处理能力是一项挑战,尤其是在资源受限的情况下。本文将探讨Python协程的概念、原理及其在提高并发性能中的应用。通过对比传统多线程和多进程模型,我们将揭示Python协程如何以更少的资源消耗实现高效的并发任务处理。文章还将通过实例代码演示协程的创建、事件循环的管理以及异步编程的最佳实践,旨在为读者提供一种更轻量级、更高效的并发编程方法。
|
缓存 负载均衡 算法
多线程基础概念
多线程是所有编程技术的基础概念,java的多线程机制是完整而且方便的。犹如算法,可能90%的时候我们都不会思考多线程相关的使用,但不能心中无算法(多线程),否则一般坑比较深,不容易爬出来。本文主要粗线条讨论Java多线程技术的相关概念和问题。
493 0
多线程基础概念