创新互联Python教程:asyncore—-异步套接字处理器

asyncore —- 异步套接字处理器

源码: Lib/asyncore.py

10年积累的做网站、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有霍林郭勒免费网站建设让你可以放心的选择与我们合作。

从版本 3.6 开始标记为过时,将在版本 3.12 中移除。: The asyncore module is deprecated (see PEP 594 for details). Please use asyncio instead.


备注

该模块仅为提供向后兼容。我们推荐在新代码中使用 asyncio 。

该模块提供用于编写异步套接字服务客户端与服务端的基础构件。

Availability: not Emscripten, not WASI.

This module does not work or is not available on WebAssembly platforms wasm32-emscripten and wasm32-wasi. See WebAssembly platforms for more information.

只有两种方法让单个处理器上的程序“同一时间完成不止一件事”。 多线程编程是最简单和最流行的方法,但是还有另一种非常不同的技术,它可以让你拥有多线程的几乎所有优点,而无需实际使用多线程。 它仅仅在你的程序主要受 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 形参是一个条目为所监视通道的字典。 当通道关闭时它们会被从映射中删除。 如果省略 map,则会使用一个全局映射。 通道 (asyncore.dispatcher, asynchat.async_chat 及其子类的实例) 可以在映射中任意混合。

class asyncore.dispatcher

dispatcher 类是对低层级套接字对象的轻量包装器。 要让它更有用处,可以从异步循环调用一些事件处理方法。 在其他方面,它可以被当作是普通的非阻塞型套接字对象。

在特定时间或特定连接状态下触发的低层级事件可通知异步循环发生了特定的高层级事件。 例如,如果我们请求了一个套接字以连接到另一台主机,我们会在套接字首次变得可写时得知连接已建立(在此刻你将知道可以向其写入并预期能够成功)。 包含的高层级事件有:

事件

描述

handle_connect()

由首个读取或写入事件引起

handle_close()

由不带可用数据的读取事件引起

handle_accepted()

由在监听套接字上的读取事件引起

在异步处理过程中,每个已映射通道的 readable() 和 writable() 方法会被用来确定是否要将通道的套接字添加到已执行 select()poll() 用于读取和写入事件的通道列表中。

因此,通道事件的集合要大于基本套接字事件。 可以在你的子类中被重载的全部方法集合如下:

此外,每个通道都委托或扩展了许多套接字方法。 它们大部分都与其套接字的对应方法几乎一样。

class asyncore.dispatcher_with_send

dispatcher 的一个添加了简单缓冲输出功能的子类,适用于简单客户端。 对于更复杂的用法请使用 asynchat.async_chat。

class asyncore.file_dispatcher

file_dispatcher 接受一个文件描述符或 file object 以及一个可选的 map 参数,并对其进行包装以配合 poll()loop() 函数使用。 如果提供一个文件对象或任何具有 fileno() 方法的对象,其方法将被调用并传递给 file_wrapper 构造器。

可用性: Unix。

class asyncore.file_wrapper

file_wrapper 接受一个整数形式的文件描述符并调用 os.dup() 来复制其句柄,以便原始句柄可以独立于 file_wrapper 被关闭。 这个类实现了足够的方法来模拟套接字以供 file_dispatcher 类使用。

可用性: Unix。

asyncore 示例基本 HTTP 客户端

下面是一个非常基本的 HTTP 客户端,它使用了 dispatcher 类来实现套接字处理:

 
 
 
 
  1. import asyncore
  2. class HTTPClient(asyncore.dispatcher):
  3. def __init__(self, host, path):
  4. asyncore.dispatcher.__init__(self)
  5. self.create_socket()
  6. self.connect( (host, 80) )
  7. self.buffer = bytes('GET %s HTTP/1.0\r\nHost: %s\r\n\r\n' %
  8. (path, host), 'ascii')
  9. def handle_connect(self):
  10. pass
  11. def handle_close(self):
  12. self.close()
  13. def handle_read(self):
  14. print(self.recv(8192))
  15. def writable(self):
  16. return (len(self.buffer) > 0)
  17. def handle_write(self):
  18. sent = self.send(self.buffer)
  19. self.buffer = self.buffer[sent:]
  20. client = HTTPClient('www.python.org', '/')
  21. asyncore.loop()

asyncore 示例基本回显服务器

下面是一个基本的回显服务器,它使用了 dispatcher 类来接受连接并将入站连接发送给处理程序:

 
 
 
 
  1. import asyncore
  2. class EchoHandler(asyncore.dispatcher_with_send):
  3. def handle_read(self):
  4. data = self.recv(8192)
  5. if data:
  6. self.send(data)
  7. class EchoServer(asyncore.dispatcher):
  8. def __init__(self, host, port):
  9. asyncore.dispatcher.__init__(self)
  10. self.create_socket()
  11. self.set_reuse_addr()
  12. self.bind((host, port))
  13. self.listen(5)
  14. def handle_accepted(self, sock, addr):
  15. print('Incoming connection from %s' % repr(addr))
  16. handler = EchoHandler(sock)
  17. server = EchoServer('localhost', 8080)
  18. asyncore.loop()

新闻标题:创新互联Python教程:asyncore—-异步套接字处理器
本文来源:http://www.turtgq.com/article/coisejd.html

其他资讯