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爬虫之抓取百度贴吧代码分享
Nov 06 Python
python getopt详解及简单实例
Dec 30 Python
在centos7中分布式部署pyspider
May 03 Python
Python基于回溯法子集树模板解决m着色问题示例
Sep 07 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
python3 实现一行输入,空格隔开的示例
Nov 14 Python
django框架事务处理小结【ORM 事务及raw sql,customize sql 事务处理】
Jun 27 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
提取视频中的音频 Python只需要三行代码!
May 10 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框架排名
2013/07/04 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
js实现文字截断功能
2016/09/14 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
深入理解Django的自定义过滤器
2017/10/17 Python
python实现感知器
2017/12/19 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
python安装scipy的方法步骤
2019/06/26 Python
python第三方库学习笔记
2020/02/07 Python
django rest framework 过滤时间操作
2020/07/12 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
python中操作文件的模块的方法总结
2021/02/04 Python
德国高尔夫商店:Golfshop.de
2019/06/22 全球购物
档案管理员岗位职责
2013/12/01 职场文书
小学亲子活动总结
2014/07/01 职场文书
2014年组织部工作总结
2014/11/14 职场文书
离婚案件原告代理词
2015/05/23 职场文书
2016年领导干部廉政承诺书
2016/03/24 职场文书