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实现web端用户登录和注册功能的教程
Apr 30 Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
Python 实现域名解析为ip的方法
Feb 14 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
Mar 14 Python
python时间序列按频率生成日期的方法
May 14 Python
Python3分析处理声音数据的例子
Aug 27 Python
Python爬虫之urllib基础用法教程
Oct 12 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
在python中使用pyspark读写Hive数据操作
Jun 06 Python
jupyter使用自动补全和切换默认浏览器的方法
Nov 18 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
如何做到多笔资料的同步
2006/10/09 PHP
回帖脱衣服的图片实现代码
2014/02/15 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
layui中table表头样式修改方法
2018/08/15 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
Python Tkinter 简单登录界面的实现
2019/06/14 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
美国女孩服装购物网站:Justice
2017/03/04 全球购物
中职应届生会计求职信
2013/10/23 职场文书
质检员岗位职责
2013/12/17 职场文书
教师学习培训邀请函
2014/02/04 职场文书
应届生自荐信范文
2014/02/21 职场文书
撤诉申请怎么写
2015/05/19 职场文书
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript