跳转到主要内容

纯Python协程异步I/O

项目描述

Bluelet是一个简单的、纯Python编写的异步套接字应用程序解决方案。它使用PEP 342协程来使并发I/O看起来和表现像顺序编程。

因此,它与Greenlet绿色线程库及其相关包EventletGevent类似。Bluelet具有更简单、100%纯Python实现,但与基于Greenlet的解决方案相比,牺牲了灵活性和性能。然而,它应该足够用于许多不需要严重可扩展性的应用程序;它可以被视为比asyncore更糟糕的替代品,或者是一个异步替代品SocketServer(以及更多)。

“回声”服务器

“回声”服务器是一个用于演示套接字编程的典型愚蠢示例。它简单接受连接,读取行,并将读取的每一行都写回客户端。

以下是一个使用普通Python套接字的示例

import socket
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.bind(('', 4915))
listener.listen(1)
while True:
    sock, addr = listener.accept()
    while True:
        data = sock.recv(1024)
        if not data:
            break
        sock.sendall(data)

代码非常简单,但其同步性有一个主要问题:服务器一次只能接受一个连接。即使对于非常小的服务器应用程序也不行。

解决这个问题的方法是为每个运行相同同步代码的操作系统线程或进程进行fork。然而,这很快变得复杂,使得应用程序难以管理。Python的asyncore模块提供了一种编写接受同一操作系统线程中多个连接的异步服务器的方法

import asyncore
import socket
class Echoer(asyncore.dispatcher_with_send):
    def handle_read(self):
        data = self.recv(1024)
        self.send(data)
class EchoServer(asyncore.dispatcher):
    def __init__(self):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bind(('', 4915))
        self.listen(1)
    def handle_accept(self):
        sock, addr = self.accept()
        handler = Echoer(sock)
server = EchoServer()
asyncore.loop()

异步I/O允许线程运行单个