`

[代码分析]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
分享到:
评论

相关推荐

    Simple_Presentation_Card:简单演示,演示和演示

    从压缩包子文件的文件名称列表 "Simple_Presentation_Card-master" 来看,这可能是一个GitHub仓库的克隆,其中可能包含源代码文件、示例、文档和其他资源。常见的文件结构可能包括: - `index.html`:主页面文件,...

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

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

    python decorator==4.4.2

    在Odoo这样的框架中,装饰器被广泛用于实现如权限控制、日志记录、性能分析等功能。在"python decorator==4.4.2"版本中,我们可以探讨这个库提供的装饰器功能及其在Odoo中的应用。 首先,让我们理解什么是Python...

    Laravel开发-simplecurl

    SimpleCurl 可以与其他 Laravel 组件(如 Auth、Cache、Log 等)结合使用,以实现更复杂的业务逻辑。例如,你可以在发送请求前添加认证令牌,或者将请求结果缓存起来,减少不必要的网络延迟。 总之,SimpleCurl 为 ...

    serviceworker-simple:一个简单的Service Worker示例

    在 "serviceworker-simple" 示例中,可能包含以下文件: 1. `service-worker.js`: 这是Service Worker的核心脚本,其中定义了对不同事件的响应。例如,我们可能会看到如下代码: ```javascript self....

    Python进阶

    **示例代码**: ```python def print_args(*args): for arg in args: print(arg) print_args('Hello', 'World', 42) ``` 在这个例子中,`print_args`函数可以接受任意数量的位置参数,并且这些参数会被打包成一...

    PLSQL最佳实践

    - 示例:`LOOP DBMS_OUTPUT.PUT_LINE('Simple loop.'); EXIT WHEN v_counter > 10; v_counter := v_counter + 1; END LOOP;` **3.12.2 FOR循环** - 示例:`FOR i IN 1..10 LOOP DBMS_OUTPUT.PUT_LINE('FOR loop: ' ...

    JavaCachingwithGuava

    #### Simple LoadingCache 示例 下面的示例展示了如何创建一个简单的 `LoadingCache`: ```java CacheLoader, String> loader = new CacheLoader, String>() { public String load(String key) { return key....

    simple01pwa:simple01pwa

    【标题】"simple01pwa:simple01pwa" 暗示这是一个关于渐进式网络应用(PWA,Progressive Web App)的项目,可能是初学者或教学用的示例。PWA是一种利用现代Web技术创建的网页应用,它们能够提供接近原生应用的体验,...

    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. ...

    麦克泰提供的MontaVista Linux2.1系列文档

    - 示例:在`arch/ppc/config.in`中定义了不同的机器类型选择,如`RPX-Lite`、`RPX-Classic`、`NETE860` 和 `HD860`,并为`8xx`平台定义了`CONFIG_NOT_COHERENT_CACHE`。 #### 四、编译Linux内核 - **步骤**: 1. ...

    php 实现 webservice

    #### 示例代码解析 - **SOAP客户端**:使用`SoapClient`类实例化并指定WSDL文件路径,通过调用服务方法或使用`__getFunctions()`、`__getTypes()`等方法查询服务的可用函数和类型。 ```php $soap = new SoapClient...

    SoapClient_20150904.zip

    【标题】"SoapClient_20150904.zip" 涉及的核心知识点是使用`SoapClient`在PHP中进行SOAP(Simple Object Access Protocol)通信,这是Web服务的一种标准协议,允许应用程序通过HTTP交换结构化和类型化的信息。...

    net-snmp开发详解

    - 这些API涵盖了缓存机制等高级特性,例如可以使用`snmp_cache_t`结构体来管理缓存数据。 3. **配置文件**: - 动态加载的共享对象会从与核心守护进程相同的配置文件中获取配置信息。 - 这意味着可以通过统一的...

    simple-dask-example

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

    SimpleCommand框架ImageLoader API详解(三)

    虽然示例代码中提到了Picasso库,这表明ImageLoader可能是基于Picasso进行封装或扩展的,但没有详细描述具体的实现细节。Picasso是一个流行的Android图片加载库,它简化了图片的加载、缓存和显示过程。 总结起来,...

    PHP程序与服务器端通讯方法小结

    在实际应用中,你需要根据具体需求调整上述示例代码,包括但不限于数据库连接参数、查询语句以及处理逻辑等。 以上三种方法各有特点: - **CURL** 方式适用于简单的HTTP请求场景。 - **SOCKET** 方式适用于需要更...

    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 【实验步骤】 一、建立自己的平台...

Global site tag (gtag.js) - Google Analytics