2019独角兽企业重金招聘Python工程师标准>>>

该模块提供了异步socket服务客户端和服务器的基础架构。

只有两种方法让程序在单个处理器上的同时做超过一件的事情。 多线程编程是最简单,最普遍的方式,但还有另一种非常不同的技术,可以让你具有多线程几乎所有的优点,实际上并没有使用多线程。程序的瓶颈主要在于I/O时是比较可行的。如果你的程序的瓶颈在处理器,确实需要多线程,不过网络服务器的瓶颈大多在I/O。

如果您的操作系统支持I/O库的select()系统调用(一般都支持) ,那么你可以使用它同时处理多个通信信道,做其他的工作的同时让I/O在后台执行,这比多线程更容易理解。

asyncore和asynchat的基本思路是创建一个或多个网络通道,即asyncore.dispatcher和asynchat.async_chat的实例。然后添加到全局映射,如果你没有创建自己的映射,可以直接使用loop()函数。loop()激活所有通道服务,执行直到最后一个通道关闭。

接口文档

  • asyncore.loop([timeout[, use_poll[, map[, count]]]])

进入轮询循环直到所有打开的通道已被关闭或计数通过。所有的参数都是可选的。 count参数默认为None,只有当所有通道都被关闭时循环才会终止。 timeout参数设置为select()或poll()调用设置超时,以秒为单位,默认为30秒。use_poll参数,如果为true ,则表示 poll()优先于select(),默认值为False。map是包含监控的channel的字典。channel关闭时会从map中删除。不指定map时会使用全局map。Channel(asyncore.dispatcher , asynchat.async_chat和其子类的实例)可以自由地混合在map上)。

  • class asyncore.dispatcher: dispatcher底层socket的轻便包装。它有一些事件处理供异步循环调用。否则,它可以被视为一个正常的非阻塞socket对象。底层事件的触发或者连接状态改变通知异步循环发生了高层事件,高层事件有:

    • handle_connect():Implied by the first read or write event。

    • handle_close():Implied by a read event with no data available。

    • handle_accept():Implied by a read event on a listening socket。

  • asyncore.dispatcher的新方法:在异步处理,每个映射通道的readable()和writable()方法用于确定通道的socket是否应该被添加到select()或poll()通道的频道列表中以读写事件。因此通道事件比基本socket 事件要多。在子类中重写的方法如下:

    • handle_read():当异步循环检测到通道的read()将成功时调用。

    • handle_write():当异步循环检测到通道的write()将成功时调用。需要缓冲以提高性能。

      def handle_write(self):sent = self.send(self.buffer)self.buffer = self.buffer[sent:]
    • handle_expt():当有socket连接有带外数据【 out of band (OOB)】时调用。这几乎不会发生,因为OOB的支持很好且很少使用。

    • handle_connect():当活动socket实际创建连接时调用。可能发送“welcome” banner,或与远程端点启动协议协商。

    • handle_close():当关闭socket时调用。

    • handle_error():当异常引发又没有其他处理时调用。默认版本print压缩的traceback。

    • handle_accept():监听通道(被动开启) ,当本端通过connect()可以和远端建立连接时在监听通道(被动开启)上调用。

  • readable():每次异步循环时调用,以确定通道的socket是否应该被添加到产生读事件列表。默认的方法只返回True,表示在默认情况下,所有通道将拥有读取事件。

  • writable():每次异步循环时调用,以确定通道的socket是否应该被添加到产生写事件列表。默认的方法只返回True,表示在默认情况下,所有通道将拥有写事件。

  • 下面方法和socket相同,有些有所扩充:

    • create_socket(family, type):参见socket文档。

    • connect(address):参见socket文档。

    • send(data):发送数据到远端socket。

    • recv(buffer_size):从远端socket最多接收buffer_size字节的数据。空字符串意味着该信道已被远端关闭。

    • listen(backlog):监听的连接数,默认和最小值都为1,最大值根据系统确定,一般是5。

    • bind(address):绑定socket到address。socket必须未绑定。地址的格式取决于地址族 ,参见socket文档。调用set_reuse_addr()方法可以把socket设置为可重用的(参见设置SO_REUSEADDR选项)。

    • accept():接受连接。socket必须绑定到地址和监听连接。返回值可以是None 或一对(conn, address),其中conn是新的可用来在连接上发送和接收数据socket对象,address 是绑定到连接上远端套接字的地址。None意味着连接并没有发生,在这种情况下,服务器应该忽略并继续侦听其他连接。

    • close():关闭套接字。 Socket对象上的所有未来的操作将失败。远端将接收没有更多的数据(排队数据清空之后) 。socket也会被垃圾收集自动关闭。

  • asyncore.dispatcher_with_send:dispatcher的子类,增加了简单的缓冲输出,对于简单的客户端有用。详细资料参考:asynchat.async_chat。

  • class asyncore.file_dispatcher:封装了文件描述符或文件对象及映射参数(可选)供poll()和loop()函数使用的文件分发器。它提供了文件对象或其他具备fileno()方法的对象,调用fileno()并传递到file_wrapper构造函数。可用于UNIX。

  • class asyncore.file_wrapper:接收整数文件描述符并调用os.dup()复制句柄,这样原句柄可以关闭,而文件包装器不受影响。该类封装了大量方法以模拟socket给file_dispatcher类使用。可用于UNIX。

HTTP客户端实例

import asyncore, socketclass HTTPClient(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):passdef 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:]client = HTTPClient('192.168.4.13', '/env.htm')asyncore.loop()

上面的HTTPClient连接外面的服务器一般都会报不存在,连接本地的就好。

echo server

import asyncoreimport socketclass EchoHandler(asyncore.dispatcher_with_send):def handle_read(self):data = self.recv(8192)if data:self.send(data)class EchoServer(asyncore.dispatcher):def __init__(self, host, port):asyncore.dispatcher.__init__(self)self.create_socket(socket.AF_INET, socket.SOCK_STREAM)self.set_reuse_addr()self.bind((host, port))self.listen(5)def handle_accept(self):pair = self.accept()if pair is not None:sock, addr = pair            print 'Incoming connection from %s' % repr(addr)handler = EchoHandler(sock)server = EchoServer('localhost', 8080)asyncore.loop()

参考资料

  • 《The Python Standard Library by Example 2011》

  • http://docs.python.org/2/library/asyncore.html 主要参考

本文地址

  • http://automationtesting.sinaapp.com/blog/m_asyncore

  • 本站地址:python自动化测试http://automationtesting.sinaapp.com python开发自动化测试群113938272和开发测试群6089740 微博 http://weibo.com/cizhenshi

转载于:https://my.oschina.net/u/1433482/blog/190696

python模块介绍-asyncore 异步socket处理器相关推荐

  1. python模块介绍-gevent介绍:基于协程的网络库

    2019独角兽企业重金招聘Python工程师标准>>> python模块介绍-gevent介绍:基于协程的网络库 介绍 gevent是基于协程的Python网络库.特点: 基于lib ...

  2. python模块介绍-locustio:性能测试工具locustio

    转自:http://automationtesting.sinaapp.com/blog/m_locustio_doc python测试文章 http://weibo.com/cizhenshi?is ...

  3. python模块介绍- xlwt 创建xls文件(excel)

    python模块介绍- xlwt 创建xls文件(excel) 2013-06-24磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 ...

  4. python模块介绍- SocketServer 网络服务框架

    转载自http://my.oschina.net/u/1433482/blog/190612 摘要 SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServer, ...

  5. Python模块介绍(如何安装、使用)

    Python不仅灵活方便,而且功能强大,丰富的标准库更是让Python成为"自带电池"的编程语言. 安装其他模块 python自带的模块显然不能满足我们的需求,我们可以下载安装其他 ...

  6. Python 模块介绍

    核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. exceptions 模块 1.4. os 模块 1.5. os.path 模块 1.6. stat 模块 1.7. s ...

  7. python模块介绍-Tornado:Tornado中文文档-概述

    2019独角兽企业重金招聘Python工程师标准>>> 快速链接 tornado-4.1.tar.gz, tornado最新版本 tornado源码@github 邮件列表:讨论.最 ...

  8. Python模块介绍使用:zmail模块读取邮箱内邮件信息

    hello,大家好,我是wangzirui32,今天来教大家如何使用zmail模块读取邮箱内邮件信息,开始学习吧! 1. zmail安装 在命令行中输入以下命令即可安装: pip install zm ...

  9. 【Python从零到壹】Python模块介绍与使用

    文章目录 模块的相关概念 1. 什么是模块 2. 使用模块的好处 模块的使用 1. 自定义模块 a) 方法一: 导入模块: b) 方法二 c) 导入自己的模块 Python中的包 1. 包的介绍 2. ...

最新文章

  1. php fileputcontents,在php中file_put_contents函数起什么作用呢?
  2. TransactionScope 分布式事务
  3. [APP]- 找回Xcode7的代码折叠功能
  4. Oracle常见错误
  5. 【发现问题】IDEA设置全局新创建文件默认换行符
  6. C语言 函数指针 - C语言零基础入门教程
  7. kafka java获取topic_通过编程方式获取Kafka中Topic的Metadata信息
  8. 数据结构:单链表和双向链表
  9. Lucene(.net)学习
  10. 先有产品管理,后有产品经理
  11. 基于 Spark推荐 系统应用 现 状
  12. 【Python】《三国演义》人物出场统计
  13. 福州一般拍一套婚纱照要多少钱
  14. 深圳市工业和信息化局关于征集创新产品的通知
  15. 百度地图渲染wkt格式网格数据
  16. OSI七层——物理层介绍和安全
  17. sprintf你知道多少
  18. 叠加定理和戴维宁定理
  19. 医疗数据交易平台-区块链解决方案
  20. XTU | 人工智能入门复习总结

热门文章

  1. ceph rbd resize之后文件系统的调节
  2. 设计模式六大原则——迪米特法则(LoD)
  3. [JavaScript] js 判断闰年
  4. iphone-common-codes-ccteam源代码 CCUINavigationBar.h
  5. Elasticsearch性能监控(一)
  6. Docker(四) Dockerfile 详解
  7. java的网络功能与编程_Java的网络功能与编程(转载)
  8. Web调试工具:火狐Firefox插件Firebug介绍
  9. jpa 跨表_JPA的多表复杂查询
  10. vuex mysql_Vue插件---Vuex(仓库,数据库)