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对list列表结构中的值进行去重的方法总结
May 07 Python
python清除字符串前后空格函数的方法
Oct 21 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
详解程序意外中断自动重启shell脚本(以Python为例)
Jul 26 Python
Python使用get_text()方法从大段html中提取文本的实例
Aug 27 Python
Python字符串中添加、插入特定字符的方法
Sep 10 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
TensorFLow 变量命名空间实例
Feb 11 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 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
开源SNS系统-ThinkSNS
2008/05/18 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
实例讲解yii2.0在php命令行中运行的步骤
2015/12/01 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
原生js实现form表单序列化的方法
2018/08/02 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
原生js生成图片验证码
2020/10/11 Javascript
python中split方法用法分析
2015/04/17 Python
答题辅助python代码实现
2018/01/16 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
Python中使用双下划线防止类属性被覆盖问题
2019/06/27 Python
python读取并写入mat文件的方法
2019/07/12 Python
python函数的作用域及关键字详解
2019/08/20 Python
Django配置文件代码说明
2019/12/04 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
人事行政专员岗位职责
2014/07/23 职场文书
尊师重教演讲稿
2014/09/04 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
管理失职检讨书范文
2015/05/05 职场文书