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系列之教你如何根据图片生成字符画
May 23 Python
Python使用pymysql小技巧
Jun 04 Python
Python实现修改文件内容的方法分析
Mar 25 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
python3.7 使用pymssql往sqlserver插入数据的方法
Jul 08 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
python实现网站微信登录的示例代码
Sep 18 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
Python实现数据的序列化操作详解
Jul 07 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获得url参数中具有&的值的方法
2014/03/05 PHP
php中smarty区域循环的方法
2015/06/11 PHP
CI框架的安全性分析
2016/05/18 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
javascript跨浏览器的属性判断方法
2014/03/16 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
Python 基础教程之包和类的用法
2017/02/23 Python
Django中URL的参数传递的实现
2019/08/04 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
pytorch常见的Tensor类型详解
2020/01/15 Python
html5与css3小应用
2013/04/03 HTML / CSS
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
教育系毕业生中文求职信范文
2013/10/06 职场文书
小学生评语集锦
2014/04/18 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏