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求斐波那契数列示例分享
Feb 14 Python
python检测是文件还是目录的方法
Jul 03 Python
python计算文本文件行数的方法
Jul 06 Python
Python进阶篇之字典操作总结
Nov 16 Python
python3使用matplotlib绘制散点图
Mar 19 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
Python中字符串List按照长度排序
Jul 01 Python
详解在python操作数据库中游标的使用方法
Nov 12 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
python 爬虫网页登陆的简单实现
Nov 30 Python
Python加密与解密模块hashlib与hmac
Jun 05 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
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
详解vue-router 2.0 常用基础知识点之router-link
2017/05/10 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
python开发利器之ulipad的使用实践
2017/03/16 Python
python django 实现验证码的功能实例代码
2017/05/18 Python
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
查看django执行的sql语句及消耗时间的两种方法
2018/05/29 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
使用python3构建文件传输的方法
2019/02/13 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
介绍一下linux的文件系统
2015/10/06 面试题
学生实习自我鉴定
2013/10/11 职场文书
秋季开学典礼主持词
2014/03/19 职场文书
留学经费担保书
2014/05/12 职场文书
保护环境建议书300字
2014/05/13 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
Python制作春联的示例代码
2022/01/22 Python
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python
Python数据处理的三个实用技巧分享
2022/04/01 Python
MySQL数据库简介与基本操作
2022/05/30 MySQL