Python学习之asyncore模块用法实例教程


Posted in Python onSeptember 29, 2014

本文以实例分析了Python中asyncore模块的原理及用法,分享给大家供大家参考。具体分析如下:

asyncore库是python的一个标准库,它是一个异步socket的包装。我们操作网络的时候可以直接使用socket等底层的库,但是asyncore使得我们可以更加方便的操作网络,避免直接使用socket,select,poll等工具时需要面对的复杂。

这个库很简单,包含了一个函数和一个类
* loop()函数
* dispatcher基类
需要注意的是,loop函数是全局的,不是dispatcher的方法

每一个从dispatcher继承的类的对象,都可以看作我们需要处理的一个socket,可以是TCP连接或者UDP,甚至是其它不常用的。使用容易,我们需要定义一个类,它继承dispatcher,然后我们重写(覆盖)一些方法就可以了。

我们需要重写的方法一般都以handle_打头。

class refuse(dispatcher):
  def handle_accept():
    #do nothing ...
    pass

loop()函数负责检测一个dict,dict中保存dispatcher的实例,这个字典被称为channel。每次创建一个dispatcher对象,都会把自己加入到一个默认的dict里面去(当然也可以自己指定channel)。当对象被加入到channel中的时候,socket的行为都已经被定义好,程序只需要调用loop(),一切功能就实现了。

asyncore是python标准库中的一个良好的设计
在python的标准文档中,有一个asyncore的例子

import asyncore, socket
class http_client(asyncore.dispatcher):
  def __init__(self, host, path):
    asyncore.dispatcher.__init__(self)
    self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
    self.connect( (host, 80) )
    self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path
  def handle_connect(self):
    pass
  def handle_close(self):
    self.close()
  def handle_read(self):
    print self.recv(8192)
  def writable(self):
    return (len(self.buffer) > 0)
  def handle_write(self):
    sent = self.send(self.buffer)
    self.buffer = self.buffer[sent:]
c = http_client('www.python.org', '/')
asyncore.loop()

运行这个函数,发现python.org的首页被下载下来了,也就是说我们实现了一个http层的协议?但是我们用的仅仅是socket级别的API…那么来看看这几行代码的奥妙吧!

writable和readable在检测到一个socket可以写入或者检测到数据到达的时候,被调用,并返回一个bool来决定是否handle_read或者handle_write

打开asyncore.py可以看到,dispatcher类中定义的方法writable和readable的定义相当的简单:

def readable(self):
  return True
def writable(self):
  return True

就是说,一旦检测到可读或可写,就直接调用handle_read/handle_write,但是在上面的例子中,我们却看到了一个重载(看上去像C++的虚函数,不是吗?)

def writable(self):
  return (len(self.buffer) > 0)

很明显,当我们有数据需要发送的时候,我们才给writable的调用者返回一个True,这样就不需要在handle_write中再做判断了,逻辑很明确,代码很清晰,美中不足的是理解需要一点时间,但是不算困难吧!

其余的代码看起来就很清晰了,有一种兵来将挡的感觉。当一个http服务器发送处理完成你的请求,close socket的时候,我们的handle_close()也相应完成自己的使命。close()将对象自身从channel中删除,并且负责销毁socket对象。

def close(self):
  self.del_channel()
  self.socket.close()

loop()函数检测到一个空的channel,将退出循环,程序完成任务,exit。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python一键升级所有pip package的方法
Jan 16 Python
Python找出微信上删除你好友的人脚本写法
Nov 01 Python
Django2.1.3 中间件使用详解
Nov 26 Python
pyqt5使用按钮进行界面的跳转方法
Jun 19 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
python 实现多维数组转向量
Nov 30 Python
Python进行统计建模
Aug 10 Python
python操作redis数据库的三种方法
Sep 10 Python
python 基于selectors库实现文件上传与下载
Dec 31 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 Python
python 实现mysql自动增删分区的方法
Apr 01 Python
OpenCV-Python实现油画效果的实例
Jun 08 Python
Python中asyncore的用法实例
Sep 29 #Python
python提示No module named images的解决方法
Sep 29 #Python
python服务器端收发请求的实现代码
Sep 29 #Python
python利用beautifulSoup实现爬虫
Sep 29 #Python
Python中为feedparser设置超时时间避免堵塞
Sep 28 #Python
跟老齐学Python之从格式化表达式到方法
Sep 28 #Python
跟老齐学Python之print详解
Sep 28 #Python
You might like
php 接口类与抽象类的实际作用
2009/11/26 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
js分页之前端代码实现和请求处理
2017/08/04 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
Angular实现表单验证功能
2017/11/13 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
Javascript实现鼠标点击冒泡特效
2019/12/24 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
[01:10]DOTA2 Supermajor:英雄,由我们见证
2018/05/14 DOTA
python直接访问私有属性的简单方法
2016/07/25 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
python批量爬取下载抖音视频
2019/06/17 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
纽约州一群才华横溢的金匠制作而成:Hearth Jewelry
2019/03/22 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
工程测量与监理专业应届生求职信
2013/11/27 职场文书
股权投资意向书
2014/04/01 职场文书
2015年库房工作总结
2015/04/30 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android