博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】调用 proc_lib:spawn/1 和 erlang:spawn/1 有什么区别
阅读量:6241 次
发布时间:2019-06-22

本文共 1401 字,大约阅读时间需要 4 分钟。

在《Erlang OTP 设计原则》中的 “Sys与Proc_Lib” 一节中有如下描述:
 

模块 proc_lib 中的函数可以用于实现一种特殊进程,遵照 OTP 设计原则,但不使用标准行为。它们也可以用于实现用户自定义的(非标准)行为。

怎样算是符合 OTP 设计原理而又不使用标准行为的 “特殊进程”呢?
 

  • 以一种可以让进程放入监督树的方式启动;
  • 支持 sys 的调试功能;
  • 关注系统消息 。
什么是系统消息
 

      系统消息是用于监督树中的、带有特殊含义的消息。典型的系统消息跟踪输出的请求挂起和恢复进程执行的请求(用于发布处理中)。基于标准行为模式实现的进程会自动处理这些消息。
 


如何使用 proc_lib 中的函数创建进程?
 

  • 用 proc_lib 模块中存在的若干函数来启动进程,例如异步启动的 spawn_link/3,4 以及同步启动的 start_link/3,4,5 。
  • 使用这些函数中的任何一个启动的进程都会储存监督树所必须的信息。
  • 当使用 proc_lib:start_link 以同步方式启动进程时,调用进程直到 proc_lib:init_ack 被调用后才返回,所以必须成对使用。
在 stdlib\src\proc_lib.erl 中有如下说明
 

1
2
3
4
5
6
-module(proc_lib).
 
%% This module is used to
set
some initial information
%%
in
each created process.
%% Then a process terminates the Reason is checked and
%% a crash report is generated
if
the Reason was not expected.

而 proc_lib:spawn/1 的实现为
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spawn(F) when is_function(F) ->
    
Parent = get_my_name(),
    
Ancestors = get_ancestors(),
    
erlang:spawn(?MODULE, init_p, [Parent,Ancestors,F]).
 
init_p(Parent, Ancestors, Fun) when is_function(Fun) ->
    
put(
'$ancestors'
, [Parent|Ancestors]),
    
{module,Mod} = erlang:fun_info(Fun, module),
    
{name,Name} = erlang:fun_info(Fun, name),
    
{arity,Arity} = erlang:fun_info(Fun, arity),
    
put(
'$initial_call'
, {Mod,Name,Arity}),
    
try
   
Fun()
    
catch
   
Class:Reason ->
   
exit_p(Class, Reason)
    
end.
      可以看出,其比通常调用 erlang:spawn/1 会多出对祖先信息(Parent 和 Ancestors)和函数相关信息(module+name+arity)的处理,而这些信息是监督树所需要的。
 

转载地址:http://ylcia.baihongyu.com/

你可能感兴趣的文章
Vue入门---常用指令详解
查看>>
iOS 越狱后 SSH 不能连接
查看>>
soj 3291 Distribute The Apples II DP
查看>>
苹果App Store审核指南中文翻译(更新至140227)
查看>>
转 -- OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
查看>>
原来对MFC一无所知
查看>>
Java程序员看C++代码
查看>>
python处理Excel - xlrd xlwr openpyxl
查看>>
JS实现的购物车
查看>>
bzoj 3998 [TJOI2015]弦论——后缀自动机
查看>>
STL 的 vector 根据元素的值来删除元素的方法
查看>>
NOI2002银河英雄传说——带权并查集
查看>>
复合数据类型,英文词频统计
查看>>
“main cannot be resolved or is not a field”解决方案
查看>>
oc中使用switch实现图片浏览功能,补充其它的实现方式
查看>>
6、DRN-----深度强化学习在新闻推荐上的应用
查看>>
用父类指针指向子类对象
查看>>
Flexigrid默认是可以选择多行
查看>>
PHP导入导出Excel方法小结
查看>>
ZOJ 3870 Team Formation 位运算 位异或用与运算做的
查看>>