`
litaocheng
  • 浏览: 337741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Controlling Process

阅读更多
昨天写测试代码的时候,遇到了一些疑惑,那就是erlang中control process.

在使用gen_tcp进行开发的时候,我们可以通过调用gen_tcp:accept和gen_tcp:connect而产生socket,此时调用所在的process,称为这个socket的control process. control process的生存期控制着socket的生存期,如果control process结束了,那么Socket也会被关闭.要解除这个约束的方法是调用gen_tcp:controlling_process/2, 为Socket设置一个新的control process.

参看erlang-china中a pitfall in passing socket via processes 一文:

    在花了大半天“追根究底”之后,发现原因是这样的:“socket 是通过 port 实现的,如果这个 port 的 owner process 退出,那么这个 port 也会关闭”。

让我们在通过一个例子来更深的理解一下:

-module(r3).
-compile(export_all).

  start() ->
      spawn(r3, start, ["www.erlang.org", 80]).

  start(RHost, RPort) ->
      io:format("start:pid=~p~n", [self()]),
      {ok, Sock} = gen_tcp:connect(RHost, RPort, [list, {packet, 0}, {active, false}, {reuseaddr, true}]),
      io:format("start:socket=~p~n", [erlang:port_info(Sock)]),
      Test = spawn(r3, test, [Sock]),
      %% 注释A: 让Sock的contrl process等待一会,从而允许test process使用Sock进行工作
      %%receive
      %%after 1000 ->
      %%	ok
      %%end.
      %% 注释B: gen_tcp:controlling_process(Sock, Test).

  test(Sock) ->
     %%注释C: gen_tcp:controlling_process(Sock, self()),
      io:format("test:pid=~p~n", [self()]),
      io:format("socket=~p~n", [erlang:port_info(Sock)]),
      ok = gen_tcp:send(Sock, "GET / HTTP/1.0\r\n\r\n"),
      case gen_tcp:recv(Sock, 0) of
          {ok, Pack} ->
              io:format("recv:ok:~p~n", [Pack]);
          Any ->
              io:format("recv:~p~n", [Any])
      end,
      ok = gen_tcp:close(Sock).


上面的几个spwan只是为了测试socket在不同process之间处理的情况,因此上面代码不应该是你写程序参考的代码.

如果没有A,B,C三个注释,那么这个module会运行出错,提示Sock undef, 这就是control process起的坏作用,其退出导致socket被关闭. 让我们一步一步的验证我们的想法吧.

1,如果仅仅去除注释A, 我们的control process在spawn(r3, test, [Sock])后,会等待1秒钟,这样Sock不会随着control process的结束而关闭,因此我们可以获取www.erlang.org的内容

2,如果仅仅去除注释B, 那么我们通过controlling_process/2,将Sock的control process设置为Test,这样我们也可以收到www.erlang.org的内容

3,如果仅仅去除注释C,那么我们几乎不能收到任何内容就出现了错误,因为control process退出的速度要大于Test process启动的速度. 我们也可以通过process间发送消息的方法做到两个线程间的同步,从而确保Test process获取Sock的控制权以后原线程在退出. 动手试验一下吧.
分享到:
评论

相关推荐

    Workflow-based Process Controlling

    ### 工作流为基础的过程控制 (Workflow-based Process Controlling) #### 概述 《工作流为基础的过程控制》一书由Michael zur Muehlen撰写,该书深入探讨了如何利用工作流技术来提升企业的业务流程管理水平。随着...

    SAPFI财务基础教程中文版.pptx

    九、R/3 Controlling Process Overview(R/3 Controlling Process Overview) R/3 Controlling Process Overview是指SAP FI的控制流程概述,包括财务管理流程、采购管理流程、库存管理流程、生产管理流程、销售管理...

    一篇Mobile GIS的资料

    interpretation and controlling process. Such systems enable to gather and analyse effectively all available data on the landscape and based on these analyses These are objective of the WirelessInfo ...

    项目管理知识体系概览

    4. 控制过程组(Controlling Process Group):此阶段关注项目的监控和调整,如整体变更控制、进度控制、成本控制、质量控制、风险响应控制。通过监控项目绩效,及时发现偏差并采取纠正措施。 5. 结束过程组...

    2024-中项英语词汇——51CTO软考内部资料_1-3.pdf

    4. 监控过程组(Monitoring and Controlling Process Group) 监控过程组是指跟踪、审查项目活动和结果,从而评估项目进展和性能的过程。它涉及在项目进行中识别偏差和采取纠正措施以保证项目按计划前进。 5. 收尾...

    软考高项必过英语词汇表

    30. **Controlling Process**: "控制过程组"监控项目性能,识别偏差,并采取纠正措施。 31. **Closing Process**: "收尾过程组"完成项目或项目阶段的正式结束。 此外,还有诸如变更控制、工作说明书、进度管理、...

    pmp47个过程组和各个过程的输入输出及常用缩写.docx

    4. **监控过程组** (Monitoring & Controlling Process Group, M&CPG) - **4.4 监控项目工作** (Monitor Project Work, MPW): 输出包括变更请求、工作绩效数据等。 - **4.5 实施整体变更控制** (Implement Overall...

    pmp 47个过程

    4. **监控过程组**(Monitoring and Controlling Process Group): - **监督项目工作**(Monitor Project Work):跟踪、审查和调整项目进度和性能。 - **控制范围**(Control Scope):确保项目只完成批准的变更...

    第六版PMBOK 49个过程组

    4. 监控过程组( Monitoring and Controlling Process Group):该过程组包括监控项目工作、控制项目成本、控制项目质量、控制项目进度、控制项目范围等过程。 * 4.5 监控项目工作:监控项目的进度和绩效。 * 7.4 ...

    PMP47个子过程讲解.zip

    4. **监控过程组**(Monitoring and Controlling Process Group): - **监控项目工作**(Monitor Project Work):跟踪、审查和调整项目进展。 - **控制范围**(Control Scope):确保项目范围只按批准的变更进行...

    项目管理流程图表

    控制过程(Controlling Process) - **定义**:控制过程是指监督项目的实际进展,识别偏差,并采取措施确保项目目标达成的过程。 - **活动**:进度监控、成本控制、风险评估等。 - **成果**:项目状态报告、变更...

    Hook windows native API 的示例源代码

    - `Hooking the native API and controlling process creation on a system-wide basis.txt`:这个文件可能包含了一个示例,讲解如何通过Hook Native API来控制系统级别的进程创建。在这个过程中,开发者可能会Hook...

    JLink_Windows_V648.zip

    Version V6.48 (2019-07-26) Added flash programming support for AmbiqMicro's AMA2B1KK (Apollo2 Blue; AMA2BEVB). Added flash programming support for AmbiqMicro's AMA2B1KK (Apollo2 Blue;...

    PMBOK第六版十个知识领域五个过程组(十五至尊图)

    监控过程组(Monitoring and Controlling Process Group):包含12个过程,负责跟踪、审查和调整项目进展和性能,解决过程中的偏差。 收尾过程组(Closing Process Group):包含1个过程,专注于完成所有项目活动以...

    Mechanism of Controlling Cross-linking Polymerization Progress

    Mechanism of Controlling Cross-linking Polymerization Progress,栗方星,Sun Ruimin, A mechanism of controlling cross-linking polymerization process is reported in this paper. Chain propagation of ...

    Prince2 Process Model

    **监控和控制项目(Controlling a Stage, CS)** 在项目执行过程中,需要持续监控项目的进展,确保各项活动按计划进行。如果出现偏差,则需要采取适当的纠正措施。 #### 6. **结束项目(Closing a Project, CP)** ...

Global site tag (gtag.js) - Google Analytics