原文链接:http://blog.csdn.net/largetalk/article/details/7939080

看tornado源码多进程(process.py)那段,发现他的多进程模型和一般常见的模型有点不一样,多见的是主进程bind-> listen -> accept, 将accept返回的socket用子进程处理,而tornado是在bind -> listen -> fork, 在listen之后fork,多个子进程共享listen socket, 每个子进程都accept。 以前没见过这种模型,开始觉的会有 错误或"惊群“现象的发生,网上找了一下也没有找到相关资料,自己就写了个程序测试一下。

  1. import socket
  2. import select
  3. import os
  4. import time
  5. import errno
  6. def child_epoll():
  7. epoll = select.epoll()
  8. epoll.register(sock.fileno(), select.EPOLLIN)
  9. try:
  10. while True:
  11. events = epoll.poll(1)
  12. for fileno, event in events:
  13. if fileno == sock.fileno():
  14. connection, address = sock.accept()
  15. print os.getpid(), address
  16. time.sleep(1)
  17. connection.close()
  18. finally:
  19. epoll.unregister(sock.fileno())
  20. epoll.close()
  21. def start_child(i):
  22. pid = os.fork()
  23. if pid == 0:
  24. child_epoll()
  25. else:
  26. children[pid] = i
  27. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
  28. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  29. sock.setblocking(0)
  30. sock.bind(("0.0.0.0", 9700))
  31. sock.listen(128)
  32. children = {}
  33. for i in range(4):
  34. start_child(i)
  35. time.sleep(2)
  36. print children
  37. while children:
  38. try:
  39. pid = status = os.wait()
  40. except OSError, e:
  41. if e.errno ==  errno.EINTR:
  42. continue
  43. raise
  44. if pid not in children:
  45. continue
  46. children.pop(pid)
  47. sys.exit(0)

然后用ab简单测测: ab -n 10 -c 5 http://127.0.0.1:9700/

可以发现每个连接都会只有一个进程去处理。虽然逻辑上没有错误,但还是要找相关资料看看,有知道的请告诉我一下。

后补:(20121101)

http://blog.dccmx.com/2011/02/nginx-conn-handling/ 介绍nginx多进程模型就是如此工作,nginx使用一个全局锁来避免惊群

http://static.usenix.org/event/usenix2000/freenix/full_papers/molloy/molloy.pdf 该论文说linux 2.6内核之后accept不会有惊群现象

tcp通信:多进程共享listen socket方式的更多相关文章

  1. socket实现udp与tcp通信-java

    1.简单介绍Socket Socket套接字 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. 通信的两端都有Socket. 网络通信其实就是Socket间的通信. 数 ...

  2. TCP通信服务端及客户端代码

    Java TCP通信使用的是Socket(客服端)和ServerSocket(服务端),具体代码如下. server端代码: import java.io.BufferedReader; import ...

  3. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  4. 基于TCP与UDP协议的socket通信

    基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...

  5. 通信机制-TCP/IP、Http、Socket的区别

    原文转自:http://blog.csdn.net/axing1991/article/details/45149087 网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. ...

  6. JAVA Socket编程(二)之TCP通信

    基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...

  7. 【Java TCP/IP Socket】基于NIO的TCP通信(含代码)

    NIO主要原理及使用 NIO采取通道(Channel)和缓冲区(Buffer)来传输和保存数据,它是非阻塞式的I/O,即在等待连接.读写数据(这些都是在一线程以客户端的程序中会阻塞线程的操作)的时候, ...

  8. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  9. 自己封装的Socket组件,实现服务端多进程共享Socket对象,协同处理客户端请求

    DotNet.Net.MySocket是SLB.NET(Server Load Balance服务器负载均衡)项目中的核心组件. 在实际的项目中发现,单进程的服务端处理高并发的客户请求能力有限. 所以 ...

随机推荐

  1. (转)MapReduce中的两表join几种方案简介

    转自:http://blog.csdn.net/leoleocmm/article/details/8602081 1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而 ...

  2. Spark Standalone运行过程

    以下内容参考http://www.cnblogs.com/luogankun/p/3912956.html 一.集群启动过程--启动Master 二.集群启动过程--启动WorkerWorker运行时 ...

  3. 腾讯WEB前端开发三轮面试经历及面试题

    [一面]~=110分钟  2013/04/24 11:20  星期三 进门静坐30分钟做题. 填空题+大题+问答题 >>填空题何时接触电脑 何时接触前端运算符 字符串处理        延 ...

  4. Android开发笔记一(hello world)

    UI: <Button android:layout_width="wrap_content" android:layout_height="wrap_conten ...

  5. Spiral Matrix

    Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...

  6. 1486: [HNOI2009]最小圈 - BZOJ

      在机房的小伙伴提醒是二分之后,我想到了是判负环,所以我用spfa,而且我保持dis都是小于等于0,本以为这样就能过了,可是还是有一个点达到了3.8s左右(其他都是0.0几秒) 所以还是写了dfs版 ...

  7. VMware vSphere HyperVisor安装过程记录

      作者:sdjnzqr 出处:http://www.cnblogs.com/sdjnzqr/ 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者同意,必须保留此段声明:必须在文章中给出原文 ...

  8. VC6.0环境安装STLport-5.2.1

    今天安装STLport,网上搜资料安装好久,都不行,因为STLport 的版本不对,我这是STLport-5.2.1新版本. (注意:下面的步骤都在一个cmd里操作,很简单的原因:环境变量啊) 1.首 ...

  9. ARRAY_SIZE宏

    宏ARRAY_SIZE,是求设备结构体中设备的个数,   定义在linux/kernel.h中   #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[ ...

  10. 【redis】01Redis的介绍与安装部署

    单元目标: 1.NoSQL介绍 2.Redis的介绍 3.Redis适用场合 4.Redis的安装与部署 5.Redis的数据类型 6.Redis的常用命令 7.Redis的高级应用       通过 ...