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字符串关键点
Dec 13 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
Python实现打砖块小游戏代码实例
May 18 Python
python flask框架实现重定向功能示例
Jul 02 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
Aug 22 Python
Python enumerate函数遍历数据对象组合过程解析
Dec 11 Python
python带参数打包exe及调用方式
Dec 21 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
python 进程池pool使用详解
Oct 15 Python
Python中三种花式打印的示例详解
Mar 19 Python
Python编写冷笑话生成器
Apr 20 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获取文件后缀名的三个函数
2012/10/15 PHP
php实现TCP端口检测的方法
2015/04/01 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
javascript学习笔记(一)基础知识
2014/09/30 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
easyui validatebox验证
2016/04/29 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
python实现简单ftp客户端的方法
2015/06/28 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
聊聊Python中的pypy
2018/01/12 Python
详解tensorflow载入数据的三种方式
2018/04/24 Python
Python微医挂号网医生数据抓取
2019/01/24 Python
django 控制页面跳转的例子
2019/08/06 Python
Python新手学习函数默认参数设置
2020/06/03 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
介绍一下Ruby的多线程处理
2013/02/01 面试题
2014新生大学四年计划书
2014/09/21 职场文书
大学生团员个人总结
2015/02/14 职场文书
法务专员岗位职责
2015/02/14 职场文书
自我推荐信格式模板
2015/03/24 职场文书
2015大学生入党个人自传
2015/06/26 职场文书
会计岗位工作总结
2015/08/12 职场文书
小学毕业教师寄语
2019/06/21 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python