asyncore是Python内置的异步IO库。asyncore
负责socket事件轮询,用户编写代码时只需要提供回调方法即可,asyncore
会在相应的事件到来时,调用用户提供的回调方法。比如当serversocket
的read
事件到来时,会自动调用handle_accept
方法, 当socket的read
事件到来时,调用handle_read
方法。
RPC服务器异步模型的实现
代码如下:
1 | #!/usr/bin/env python3 |
上面的代码使用了BytesIO
作为读缓冲,用于缓存半包消息和刚刚从套接字那里读取到的字节数据。消息处理完毕之后要对读缓冲进行截断处理,将已经处理的字节数据截掉。BytesIO
的读写游标要小心使用,读的时候游标从头开始,写的时候游标从尾部开始追加,seek
函数用来移动游标。
RPC服务器进程池异步模型的实现
单个进程的异步模型,最多只能榨干一个CPU。在Python中,因为存在GIL锁,所以多线程并不能使用多核。如果要充分利用现代处理器的多核优势,可以使用多进程。
将进程池和事件轮询异步读写结合起来。进程池中的每个子进程内部都是一个事件循环,一个进程可以榨干一个 CPU 核心,多个进程就可以榨干多个CPU核心。
代码实现和前面的单进程异步模型差别不大,就是多了个创建进程池的调用。进程池的创建在服务器套接字启用监听队列之后进行,这样每个子进程都可以使用服务器套接字来获取新连接进行处理。
1 | class RPCServer(asyncore.dispatcher): |