python epoll实现异步socket

一、同步和异步:

在程序执行中,同步运行意味着等待调用的函数、线程、子进程等的返回结果后继续处理;异步指不等待当下的返回结果,直接运行主进程下面的程序,等到有返回结果时,通知主进程处理。有点高效。

二、epoll实现异步网络通信:

首先epoll只支持linux下的python。

服务端实现epoll异步的主要流程就是如下代码,讲解将在代码里面书写:

 1 # -*- coding:utf -*-
 2
 3 import socket
 4 import select
 5 ‘‘‘
 6 需要用到的lib文件:
 7 socket、select
 8 ‘‘‘
 9 if __name__ == "__main__":
10     server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
11     server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#IP地址端口复用
12     ipaddress = "127.0.0.1"
13     port = 33445
14     address = (ipaddress,port)
15     serverfd = server.fileno()
16     server.bind(address)
17     serverdict = {}
18     serverdict[serverfd] = server
19     epoll = select.epoll()#创建epoll对象
20     epoll.register(serverfd,select.EPOLLIN)#注册消息类型(输入)
21     server.listen(5)
22     while True:
23         events = epoll.poll(1)#创建事件队列
24         for fileno,event in events:
25             if fileno == serverfd:
26                 (client,address) = socket.accept()
27                 print "<-----",client,"----",address,"----->"
28                 client.setblocking(0)
29                 epoll.register(client.fileno(),select.EPOLLIN)#注册事件队列
30                 serverdict[client.fileno()] = client
31             elif event & select.EPOLLIN:#当有事件时候处理
32                 print "client:",fileno
33                 data = serverdict[fileno].recv(4096)
34                 print data
35                 

核心步骤如下:

 1 #创建epoll
 2 epoll = select.epoll()
 3 #注册事件队列
 4 epoll.register(socketname.filefd,select.EPOLLIN)#EPOLLIN是事件类型
 5 #创建事件队列:
 6 events = epoll.poll(1)
 7 #事件队列的数据结构:
 8 #(文件对象描述符,事件消息)
 9 #检测事件 进行处理:
10 for (fd,event) in events:
11     if event & select.EPOLLIN:
12         do_somethings()
13 #常用事件类型:
14 ‘‘‘
15 EPOLLIN    Available for read
16 EPOLLOUT    Available for write
17 EPOLLPRI    Urgent data for read
18 EPOLLERR    Error condition happened on the assoc. fd
19 EPOLLHUP    Hang up happened on the assoc. fd
20 EPOLLET    Set Edge Trigger behavior, the default is Level Trigger behavior
21 EPOLLONESHOT    Set one-shot behavior. After one event is pulled out, the fd is internally disabled
22 EPOLLRDNORM    Equivalent to EPOLLIN
23 EPOLLRDBAND    Priority data band can be read.
24 EPOLLWRNORM    Equivalent to EPOLLOUT
25 EPOLLWRBAND    Priority data may be written.
26 EPOLLMSG    Ignored.
27 ‘‘‘

其他常用的函数:

1 epoll.close()
2 epoll.fileno()#返回epoll对象的文件描述符
3 epoll.fromfd(fd)#从给定对象创建一个epoll对象
4 epoll.modify(fd,eventmask)#修改文件文件描述对象的epoll事件类型
5 epoll.unregister(fd)取消注册
6 epoll.poll(timeout=xxx,maxevents=xxx)#参数均为非必填项

原文地址:https://www.cnblogs.com/KevinGeorge/p/8183519.html

时间: 2024-11-08 21:28:55

python epoll实现异步socket的相关文章

python中asynchat异步socket命令/响应处理

该模块基于asyncore简化了异步客户端和服务器,并使其更容易元素处理由任意的字符串结束,或者是可变长度的的协议.它提供了抽象类async_chat,提供collect_incoming_data()和found_terminator()方法.循环和asyncore的一样,有2种信道:asyncore.dispatcher和asynchat.async_chat,可以自由混合信道.通常asyncore.dispatcher服务器通道在接收到连接请求时产生新的asynchat.async_cha

python异步socket编程之二

三.异步client与异步server的通信 1. 服务端代码 pythone socket的server段,开放三个端口:10000,10001,10002. 例子中是每个server绑定一个端口,测试的时候需要分别开3个shell,分别运行. 这太麻烦了,就分别用三个Thread来运行这些services #!/usr/bin/env python # # -*- coding:utf-8 -*- # File: multithrd_socket_server.py # import opt

Python异步Socket编程

异步网络据说能极大的提高网络server的连接速度,所以打算写一个专题,来学习和了解异步网络.因为Python有个非常出名的异步Lib:Twisted,所以就用Python来完成. OK,首先写一个pythone socket的server段,对开放三个端口:10000,10001,10002.krondo的例子中是每个server绑定一个端口,测试的时候需要分别开3个shell,分别运行.这太麻烦了,就分别用三个Thread来运行这些services. Java代码   import optp

Python(七)Socket编程、IO多路复用、SocketServer

本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 功能: sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) 参数一:地址簇 socket.AF_INET IPv4(默认)

Python开发Day8(socket)

Socket socket介绍: socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: fil

Python学习之路--Socket

Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: file模块是针对某个指定

C# 异步Socket

C# 异步Socket (BeginXXXX)服务器代码 前言: 1.最近维护公司的一个旧项目,是Socket通讯的,主要用于接收IPC(客户端)发送上来的抓拍图像,期间要保持通讯,监测数据包并进行处理.但是看之前那人写的代码个人觉得并不是很适合自己,于是就重写了,不过项目暂时弃置了,为了以后能够方便使用,也方便更多像我一样还是渣渣程序员的人,记录一些心得.我还是坚信那句话,分享才能够进步得更快 2.其实在做之前我对这个东西了解也很少,毕竟以我的认识,在国内C#更多地是用来开发网站,于是也在网上

c#异步Socket Tcp服务器实现

原创性申明 本文作者: 小竹zz  本文地址:http://blog.csdn.net/zhujunxxxxx 转载请注明出处. 介绍 我之前写过一篇IOCP的文章: http://blog.csdn.net/zhujunxxxxx/article/details/43573879 这个比异步socket性能好,因为它复用对象了. 在c#中微软已经提供了TcpListener和TcpClient来实现Tcp的通讯,这部分已经有人写了比较好的异步服务器代码 http://www.cnblogs.c

Python全栈【Socket网络编程】

Python全栈[socket网络编程] 本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" 用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式