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 装饰器使用详解
Jul 29 Python
python基础_文件操作实现全文或单行替换的方法
Sep 04 Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
Flask实现跨域请求的处理方法
Sep 27 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
Dec 26 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
使用Python通过oBIX协议访问Niagara数据的示例
Dec 04 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
Feb 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
Php Mssql操作简单封装支持存储过程
2009/12/11 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
php简单实现数组分页的方法
2016/04/30 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
JS解析XML的实现代码
2009/11/12 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
清除输入框内的空格
2016/12/21 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
使用python开发vim插件及心得分享
2014/11/04 Python
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
Python装饰器模式定义与用法分析
2018/08/06 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
一道Delphi上机题
2012/06/04 面试题
实习生体会的自我评价范文
2013/11/28 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
党员批评与自我批评
2014/10/15 职场文书
晚会开场白和结束语
2015/05/29 职场文书
同学聚会开幕词
2019/04/02 职场文书