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 相关文章推荐
动态创建类实例代码
Oct 07 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
python解析xml文件实例分析
May 27 Python
Python多线程下载文件的方法
Jul 10 Python
简单的Apache+FastCGI+Django配置指南
Jul 22 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
详解Python requests 超时和重试的方法
Dec 18 Python
详解Python正则表达式re模块
Mar 19 Python
Python之指数与E记法的区别详解
Nov 21 Python
Python读取实时数据流示例
Dec 02 Python
Python开发之基于模板匹配的信用卡数字识别功能
Jan 13 Python
如何使用Django Admin管理后台导入CSV
Nov 06 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和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
2011/07/03 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
jQuery中调用WebService方法小结
2011/03/28 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
微信小程序实现倒计时补零功能
2018/07/09 Javascript
SVG实现时钟效果
2018/07/17 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
基于layui的下拉列表的数据回显方法
2019/09/24 Javascript
原生javascript单例模式的应用实例分析
2020/02/23 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
经典团队口号
2014/06/06 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
班主任工作实习计划
2015/01/16 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python