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中的变量和赋值运算符
Oct 12 Python
详谈Pandas中iloc和loc以及ix的区别
Jun 08 Python
python3+pyqt5+itchat微信定时发送消息的方法
Feb 20 Python
学习python的前途 python挣钱
Feb 27 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
Django中如何使用sass的方法步骤
Jul 09 Python
Django中多种重定向方法使用详解
Jul 17 Python
Django中提示消息messages的设置方式
Nov 15 Python
Django如何使用redis作为缓存
May 21 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 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实现图片局部打马赛克的方法
2015/02/11 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
jquery中ajax使用error调试错误的方法
2015/02/08 Javascript
js实现鼠标触发图片抖动效果的方法
2015/02/27 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
JavaScript是如何实现继承的(六种方式)
2016/03/31 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
js省市区级联查询(插件版&无插件版)
2017/03/21 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
JavaScript之Map和Set_动力节点Java学院整理
2017/06/29 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
原生JavaScript实现随机点名表
2021/01/14 Javascript
python发送邮件功能实现代码
2016/07/15 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
使用python和pygame制作挡板弹球游戏
2019/12/03 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
Square Off美国/加拿大:世界上最聪明的国际象棋棋盘
2018/12/06 全球购物
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
新闻专业推荐信范文
2013/11/20 职场文书
个性大学生自我评价
2013/12/04 职场文书
初中数学教学反思
2014/01/16 职场文书
高三体育教学反思
2014/01/29 职场文书
国旗下的演讲稿
2014/05/08 职场文书
重温入党誓词主持词
2015/06/29 职场文书
python实现图片批量压缩
2021/04/24 Python