原文链接: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. Android中关于日期时间与时区的使用总结

    在开发Android的过程中,出现过几次由于日期时间导致的问题,而且主要是由于时区的原因导致,所以一直想总结一下,形成一个良好的开发规范.   一.Unix时间戳   Unix时间戳(Unix tim ...

  2. JavaWeb常见错误总结

    错误1:(Ajax未加载问题) 今天我在学习AJAX的时候,想从一个JS文件中引入JQuery,然后在这个JS文件中使用AJAX的方法.结果V8引擎一直报错,错误类型是Uncaught Referen ...

  3. Careercup - Facebook面试题 - 5177378863054848

    2014-05-02 08:29 题目链接 原题: Write a function for retrieving the total number of substring palindromes. ...

  4. Codeforces Round #343 (Div. 2) E. Famil Door and Roads

    题目链接: http://www.codeforces.com/contest/629/problem/E 题解: 树形dp. siz[x]为x这颗子树的节点个数(包括x自己) dep[x]表示x这个 ...

  5. IntelliJ IDEA 文件夹重命名--解决重命名后js文件引用找不到路径报404错误

    情景: 说明:ExtJS是我后来的改的名字--原来叫extjs,可是当我把在页面的引用地址改为 src="ExtJS/.."后页面就报404错误,我把它改回之前的extjs就可以( ...

  6. Openstack Grizzily 单节点测试机安装( All In One CentOS/RHEL)

    Openstack Grizzily版本已经相当完善,根据官方文档安装基本不存在什么问题,但是想快速测试了解Openstack功能的用户非常多,devstack的安 装需要check最新的代码,时常碰 ...

  7. hdu 1879 继续畅通工程(最小生成树,基础)

    题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<algo ...

  8. POJ 2349 Arctic Network(最小生成树,第k大边权,基础)

    题目 /*********题意解说——来自discuss——by sixshine**************/ 有卫星电台的城市之间可以任意联络.没有卫星电台的城市只能和距离小于等于D的城市联络.题 ...

  9. java001-Helloworld

    public class test05 { public static void main(String[] args) { System.out.println("Hello World! ...

  10. HDU 1227 Fast Food (DP)

    题目链接 题意 : 有n个饭店,要求建k个供应点,要求每个供应点一定要建造在某个饭店的位置上,然后饭店都到最近的供应点拿货,求出所有饭店到最近的供应点的最短距离. 思路 : 一开始没看出来是DP,后来 ...