• 未公开的erlang:port_s/get_data


    我们通常在使用port的时候, 需要把他同其他的上下文关联起来, 以便在port给我们发生数据的时候, 我们能根据绑定的上下文, 知道如何处理数据.
    有2种办法:
    1. 用ets来保存{Port, Ctx},这个比较慢, 每次都要查表.
    2. 用Port本身的空间来保存Ctx. erlang:port_set_data 和erlang:port_get_data就是干这类事情的, 一步到位, 多核free.

    不啰嗦上代码:

    root@ubuntu:~# echo test >> test.dat
    
    root@ubuntu:~# erl
    
    Erlang R14A (erts-5.8) 1 [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false] [lock-counting]
    
    Eshell V5.8  (abort with ^G)
    
    1>  {ok,{_,_,{Port,_}}} = file:open("test.dat", [read,raw]).
    
    {ok,{file_descriptor,prim_file,{#Port<0.498>,7}}}
    
    2> erlang:port_info(Port).
    
    [{name,"efile"},
    
    {links,[<0.31.0>]},
    
    {id,498},
    
    {connected,<0.31.0>},
    
    {input,9},
    
    {output,11}]
    
    3> erlang:port_set_data(Port, abcdefg).
    
    true
    
    4>  erlang:port_get_data(Port).
    
    abcdefg

    注意: gen_tcp和gen_udp等的port_data已经被使用了.

    收工!
    (就是使用这个Port的空间保存东西,如果未set就get 那么返回的是undefine,保存的内容可以重新set,那么get就是获得最新的context)

    异步通信有一步是注册socket,就用到了这个port存储。

    本文转自:~~~

  • 相关阅读:
    Java 异步编程
    对@repository,@Service, @Compent,@Controller注解的理解
    分布式锁的解决方案
    JVM垃圾收集器
    java死锁
    CountDownLatch和CylicBarrier以及Semaphare你使用过吗
    必懂知识——HashMap的实现原理
    重写equals为啥需要重写hashCode
    mysql数据库的索引
    mysql常见的优化策略
  • 原文地址:https://www.cnblogs.com/labi/p/3583284.html
Copyright © 2020-2023  润新知