tcp通信:多进程共享listen socket方式

原文链接: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。 以前没见过这种模型,开始觉的会有 错误或"惊群“现象的发生,网上找了一下也没有找到相关资料,自己就写了个程序测试一下。

[python] view plaincopyprint?

  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不会有惊群现象

时间: 2024-12-08 04:15:19

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

epoll实现IO复用,TCP通信

函数原型: 函数说明:该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它. 参数说明: fds:是一个struct pollfd结构类型的数组,用于存放需要检测其状态的Socket描述符: 每当调用这个函数之后,系统不会清空这个数组,操作起来比较方便:特别是对于socket连接比较多的情况下,在一定程度上可以提高处理的效率:这一点与select()函数不同,调用select()函数之后,select()函数会清空它所检测的socket描述

Socket简单学习之Tcp通信

Socket网络通信的简单学习 建立Tcp通信 服务器端 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace TcpSocket { //服务器端 class Program { static void Main

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

原文转自:http://blog.csdn.net/axing1991/article/details/45149087 网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可比性, socket则是对TCP/IP协议的封装和应用(程序员层面上). 也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输, 而HTTP是应用层协议,主要解决

关于QT上的TCP通信的实现(对比与VS 上C++的实现方式)

上一个blog说了C++的实现方法,但是大黑框的显示未免显得有点太过于不美观,此次具体采用QT的方式进行实现,大致上的流程是这样的: 参考上面的流程图,大致上的实现模式就是这样,但是TCP通信的全双工的形式,所以收发信息的操作对客户端还是服务端而言都i是一样的,所以我们看看代码的实现模式: 首先是TCP的实现 1.先创建这样 然后一路往下点击下一步: 需要注意的是在这里我们选择这个: 接着看看代码:serverWidget.h #ifndef SERVERWIDGET_H #define SER

C# 实现TCP通信

1.TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业应用和互联网应用.http协议在应用层运行. 02,传输层(Tanspot):传输层包括UDP和TCP,UDP几乎不对报文进行检查,而TCP提供传输保证. 03,网络层(Netwok):网络层协议由一系列协议组成,包括ICMP.IGMP.RIP.OSPF.IP(v4,v6)等. 04,链路层(Link):又称为物

TCP/IP、Http、Socket、XMPP-从入门到深入

TCP/IP.Http.Socket.XMPP-从入门到深入 终极iOS程序猿 2016-12-29 18:27 为了便于大家理解和记忆,我们先对这几个概念进行的介绍,然后分析他们的不同,再进行详细的分析. 一.TCP/IP简介 IP协议是网络层,TCP协议是传输层,HTTP协议是应用层,socket是对TCP/IP协议的代码封装和应用. TPC/IP 主要解决数据如何在网络中传输,HTTP主要解决如何包装数据. TCP/IP协议用来传输数据,应用层协议 使传输的数据有意义,应用层协议有很多,比

使用socket方式连接Nginx优化php-fpm性能

Nginx连接fastcgi的方式有2种:TCP和unix domain socket 什么是Unix domain socket?-- 维基百科 Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信.与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流.Unix domain sockets的接口和Internet socket很像,但它不使用网络底层协议来通信.Un

深入浅出--iOS的TCP/IP协议族剖析&&Socket

深入浅出--iOS的TCP/IP协议族剖析&&Socket 简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有Socket.(--该文很干,酝酿了许久!你能耐心看完吗?) 我在这个文章中,列举了常见的TCP/IP族中的协议,今天主角是--传输层协议. 传输层(Transport Layer)是OSI(七层模型)中最重要.最关键的一层,它负责总体的数据传输和数据控制的一层,传输层提供端到端(应用会在网卡注册一个端口号)的交换数据的机制,检查分组编号与次序.传输层对

TCP/IP,Http,Socket,XMPP的区别

大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,三者从本质上来说没有可比性,socket则是对TCP/IP协议的封装和应用(程序员层面上).也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据.关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍: “我们在传输数据时