一、同步和异步:

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

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

首先epoll只支持linux下的python。

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

 # -*- coding:utf -*-

 import socket
import select
'''
需要用到的lib文件:
socket、select
'''
if __name__ == "__main__":
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#IP地址端口复用
ipaddress = "127.0.0.1"
port = 33445
address = (ipaddress,port)
serverfd = server.fileno()
server.bind(address)
serverdict = {}
serverdict[serverfd] = server
epoll = select.epoll()#创建epoll对象
epoll.register(serverfd,select.EPOLLIN)#注册消息类型(输入)
server.listen(5)
while True:
events = epoll.poll(1)#创建事件队列
for fileno,event in events:
if fileno == serverfd:
(client,address) = socket.accept()
print "<-----",client,"----",address,"----->"
client.setblocking(0)
epoll.register(client.fileno(),select.EPOLLIN)#注册事件队列
serverdict[client.fileno()] = client
elif event & select.EPOLLIN:#当有事件时候处理
print "client:",fileno
data = serverdict[fileno].recv(4096)
print data

核心步骤如下:

 #创建epoll
epoll = select.epoll()
#注册事件队列
epoll.register(socketname.filefd,select.EPOLLIN)#EPOLLIN是事件类型
#创建事件队列:
events = epoll.poll(1)
#事件队列的数据结构:
#(文件对象描述符,事件消息)
#检测事件 进行处理:
for (fd,event) in events:
if event & select.EPOLLIN:
do_somethings()
#常用事件类型:
'''
EPOLLIN Available for read
EPOLLOUT Available for write
EPOLLPRI Urgent data for read
EPOLLERR Error condition happened on the assoc. fd
EPOLLHUP Hang up happened on the assoc. fd
EPOLLET Set Edge Trigger behavior, the default is Level Trigger behavior
EPOLLONESHOT Set one-shot behavior. After one event is pulled out, the fd is internally disabled
EPOLLRDNORM Equivalent to EPOLLIN
EPOLLRDBAND Priority data band can be read.
EPOLLWRNORM Equivalent to EPOLLOUT
EPOLLWRBAND Priority data may be written.
EPOLLMSG Ignored.
'''

其他常用的函数:

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

最新文章

  1. python学习之day5,装饰器,生成器,迭代器,json,pickle
  2. Spring中AOP原理,源码学习笔记
  3. angularJS常见问题汇总
  4. 行转列求和:不加 in 条件,sum的数据会不会准确?
  5. Exploit用法示例
  6. STL总结之vector
  7. Yarn应用程序运行流程剖析
  8. 整合spring2 + struts1.2 + hibernate3.2 .
  9. lsb_release: command not found 解决方法(转)
  10. FZU操作系统课程实验 实验一
  11. C# ASP.net 入门之简单通讯录
  12. Java-List泛型的用处(能够使用传入泛型对象的方法)
  13. Mysql中使用聚合函数对null值的处理
  14. 微软云linux服务器FTP文件传输错误解决办法
  15. Redux 介绍
  16. RandomShuffleQueue
  17. 【学习】Linux Shell脚本编程
  18. debug_backtrace
  19. Python:Day53 Template基础
  20. C#中Split用法【转】

热门文章

  1. 老生常谈:vim 配置
  2. 轻量级ORM框架Dapper应用一:Dapper安装
  3. YARN : Architecture of Next Generation Apache Hadoop MapReduceFramework
  4. chrome 如何利用快捷键将光标移动到地址栏
  5. 转00600异常解决方案:ORA-00600: 内部错误代码, 参数: [19004], [], [], [], [], []
  6. 【转】C# 二维码生成
  7. web 开发之酷炫--- 酷炫展示
  8. .net FrameWork各个版本之间的发展[转]
  9. iOS 数据压缩与解压
  10. 【PyMongo】连接10055错误的处理--windows7