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批量提取word内信息
Aug 09 Python
Python中函数参数调用方式分析
Aug 09 Python
python pygame实现2048游戏
Nov 20 Python
浅谈Python反射 & 单例模式
Mar 21 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 Python
Django通过dwebsocket实现websocket的例子
Nov 15 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
关于sys.stdout和print的区别详解
Dec 05 Python
Python流程控制常用工具详解
Feb 24 Python
python和php哪个容易学
Jun 19 Python
Pytorch 卷积中的 Input Shape用法
Jun 29 Python
Flask-SocketIO服务端安装及使用代码示例
Nov 26 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
Linux下编译redis和phpredis的方法
2016/04/07 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
广告切换效果(缓动切换)
2009/05/27 Javascript
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
webpack+vue.js构建前端工程化的详细教程
2020/05/10 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
python绘图库Matplotlib的安装
2014/07/03 Python
Python中查看文件名和文件路径
2017/03/31 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
python中有关时间日期格式转换问题
2019/12/25 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
Python 防止死锁的方法
2020/07/29 Python
CSS3实现头像旋转效果
2017/03/13 HTML / CSS
荷兰手表网站:Watch2Day
2018/07/02 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
安全伴我行主题班会
2015/08/13 职场文书
2016庆祝国庆67周年宣传语
2015/11/25 职场文书