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的Django框架的视图中使用Session的方法
Jul 23 Python
python从入门到精通(DAY 1)
Dec 20 Python
Python使用email模块对邮件进行编码和解码的实例教程
Jul 01 Python
python中的格式化输出用法总结
Jul 28 Python
对Python中range()函数和list的比较
Apr 19 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
Python Json模块中dumps、loads、dump、load函数介绍
May 15 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
Python 文件数据读写的具体实现
Jan 24 Python
python Yaml、Json、Dict之间的转化
Oct 19 Python
python实现扫雷游戏的示例
Oct 20 Python
Python 多线程处理任务实例
Nov 07 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
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
2015/09/06 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
JS原型和原型链原理与用法实例详解
2020/02/05 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
2020/02/25 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
简单了解python协程的相关知识
2019/08/31 Python
python实现复制文件到指定目录
2019/10/16 Python
HTML5的结构和语义(3):语义性的块级元素
2008/10/17 HTML / CSS
给校长的建议书500字
2014/05/15 职场文书
乡镇挂职心得体会
2014/09/04 职场文书
临时租车协议范本
2014/09/23 职场文书
语文复习计划
2015/01/19 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
如何利用Matlab制作一款真正的拼图小游戏
2021/05/11 Python
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android