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 正则表达式操作指南
May 04 Python
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
python使用calendar输出指定年份全年日历的方法
Apr 04 Python
python中logging包的使用总结
Feb 28 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
详解python中sort排序使用
Mar 23 Python
python浪漫表白源码
Apr 05 Python
对python3.4 字符串转16进制的实例详解
Jun 12 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
parser.add_argument中的action使用
Apr 20 Python
用 Python 制作地球仪的方法
Apr 24 Python
python 下划线的多种应用场景总结
May 12 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 开发环境配置(Zend Server安装)
2010/04/28 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
js select常用操作控制代码
2010/03/16 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
2010/06/28 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
调用innerHTML之后onclick失效问题的解决方法
2014/01/28 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
Mac 安装 nodejs方法(图文详细步骤)
2017/10/30 NodeJs
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
JS typeof fn === 'function' && fn()详解
2020/08/22 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
Python入门篇之对象类型
2014/10/17 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
解决Mac下使用python的坑
2019/08/13 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
解释一下Windows的消息机制
2014/01/30 面试题
小区物业门卫岗位职责
2014/04/10 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
茶花女读书笔记
2015/06/29 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书