`

[代码分析]simple_cache示例代码分析

 
阅读更多

这些文章可以算是读书笔记了..写在这记录一下

记录:

程序的源代码在 https://github.com/erlware/Erlang-and-OTP-in-Action-Source/tree/master/chapter_06

编译程序在window下出错的(elrc -o ebin src/*.erl 显示src/*.erl:none: I/O error)的 可以用以下命令:

FOR %f in (src\*.erl) DO erlc -W -o ebin "%f"

 

这个示例程序中包含了几种行为模式:

sc_app 是application行为 包含了最基本的启动和停止。

sc_sup 是supervisor行为  在程序中是根监督者,并负责创建sc_element。

sc_element 是gen_server行为 通用服务器 这边用处是作为一个进程保存内容(State中) 提供超时清除

 

其他的

simple_cache是用户接口

sc_store相当于数据库访问接口(类似java中的DaoImpl)

 

 

 

sc_app作为程序启动的入口 

程序通过application:start(simple_cache)启动 启动后初始化数据库并启动根监督者:

start(StartType, StartArgs) ->
   sc_store:init(),
   case sc_sup:start_link() of 
     {ok, Pid} ->
            {ok, Pid};
        Other ->
            {error, Other}
    end.

 

 

sc_sup负责监督工作者sc_element 同时sc_element由sc_sup代理创建

流程如下: --->  sc_element:create/2  调用-->sc_sup:start_child/2 -->调用 supervisor:start_child/2 -->sc_element:start_link/2 -->gen_server:start_link/3

创建后sc_element就由sc_supervisor管理(如下图):


 (使用的模式是simple_one_for_one 工作者只能有一种类型 不会随监督者启动而启动 通过start_child动态启动).

 

 

sc_store保存了 key-PID的映射

记录的PID是sc_element的进程 value在sc_element内

这个PID的作用是 让gen_server:cast/2 和 gen_server:call/2 找到对应的进程并执行操作 代码如下:

fetch(Pid) ->
  gen_server:call(Pid,fetch).

 该代码交给模块中具体的handle_call/3来完成 

 

 

其他的内容都比较简单了

不过发现代码存在一个不是很严重的问题

用户接口处的代码存在竞态条件:

insert(Key, Value) ->
    case sc_store:lookup(Key) of
        {ok, Pid} ->
            sc_element:replace(Pid, Value);
        {error, _} ->
            {ok, Pid} = sc_element:create(Value),
            sc_store:insert(Key, Pid)
    end.

 先检查后执行

不过对于ETS来说插入的key相同只是一个覆盖而已 这边顶多产生不被记录在表里的Pid(该进程也会在默认时间内被清除)

  • 大小: 22.2 KB
分享到:
评论

相关推荐

    php多进程框架-模拟java多线程接口simple-fork-php.zip

    SimpleFork simple-fork-php 是基于 PCNTL 扩展的进程管理包,接口类似与 Java 的 Thread 和 Runnable 为什么要写 SimpleFork 多进程程序的编写相比较多线程编写更加复杂,需要考虑进程回收、同步、互斥、...

    ZendFramework中文文档

    3.2.3. 高级用法示例 3.3. 摘要式认证 3.3.1. 简介 3.3.2. 规范(Specifics) 3.3.3. 身份(Identity) 3.4. HTTP 认证适配器 3.4.1. 简介 3.4.2. 设计回顾 3.4.3. 配置选项 3.4.4. Resolvers 3.4.4.1. ...

    JAVA上百实例源码以及开源项目源代码

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术,...

    simple-dask-example

    $ docker-compose build --no-cache $ docker-compose up --scale dask-worker=4 达克斯笔记 Dask资讯主页网址: Dask客户端网址: 使用Dask时,工作包版本应与您的客户端匹配。 客户是您的代码,它通过调度程序...

    parcel-phina-simple-example:包裹+ phina.js简单示例

    包裹+ phina.js简单示例 如何使用 开发者 在http://localhost:1234上构建和托管代码。 构建代码输出到dist目录。 npm run dev 建造 构建代码。 产品代码输出到build目录。 npm run build 清除 清除所有缓存文件并...

    uboott移植实验手册及技术文档

    了解 U-Boot-1.3.1 的代码结构,掌握其移植方法。 【实验环境】 1、Ubuntu 7.0.4发行版 2、u-boot-1.3.1 3、FS2410平台 4、交叉编译器 arm-softfloat-linux-gnu-gcc-3.4.5 【实验步骤】 一、建立自己的平台...

    java开源包8

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    JAVA上百实例源码以及开源项目

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术,...

    java开源包10

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    企业后台管理基础框架 hsweb.zip

    分布式事务,多数据源事务全靠他.Cache:spring-cache. 统一接口,注解使用,simple,redis... 自动切换.Scheduler:quartz. 开源稳定,支持集群.自家:hsweb-commons :通用工具类hsweb-easy-orm :为动态表单设计的orm...

    asp.net知识库

    ASP.NET 2.0 正式版中无刷新页面的开发(示例代码的补充) ASP.NET2.0中themes、Skins轻松实现网站换肤! ASP.NET 2.0 中的代码隐藏和编译 ASP.NET 2.0 Language Swithcer and Theme Swicher 多语言转换和多样式主题...

    java开源包1

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包11

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包2

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包3

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包6

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包5

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包4

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包7

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

Global site tag (gtag.js) - Google Analytics