4

我目前有一个结构如下的程序:

set_up_everthing()

while True:
    if new_client_ready():
        connect_new_client()

    for client in clients:
        if client.is_ready():
            get_input_from(client)

    update_program_state_based_on_input()

    for client in clients:
        if client.is_ready():
            send_output_to(client)

clean_up()

网络 I/O 目前使用套接字和选择,但我想重写它以使用 asyncio 库。我想我了解如何制作一个简单的 asyncio 程序,这个想法似乎是当你想做一些 I/O 时,你yield from有一个函数来做它,所以当主循环得到一个新的客户端时,它会做yield from accept_client(),当该客户端接收到的信息yield from read_information(),依此类推。但是,我不知道如何将它与程序的其他部分结合起来。

4

2 回答 2

3

asyncio模块有两个级别的 API:低级 传输和协议 API高级 流 API。它们就像不同的框架。根据您使用的 API 级别,您的程序结构可能会有很大差异。

为了防止自己发疯,通常你不想混合这两个级别的 API。

这两个级别的不同之处在于您以不同的方式接收数据。低级 API 提供事件驱动接口,您的程序通过实现回调来响应传入事件 -框架调用您的代码。高级 API 看起来更漂亮,因为它提供了读取器和写入器,并且您的代码调用了框架

文档中的示例asyncio应该很容易理解。

于 2015-05-20T03:10:02.483 回答
2

您的代码段大致描述了 asyncio 本身的工作方式。

请查看asyncio 示例以了解如何使用asyncio:

import asyncio

@asyncio.coroutine
def echo_server():
    yield from asyncio.start_server(handle_connection, 'localhost', 8000)

@asyncio.coroutine
def handle_connection(reader, writer):
    while True:
        data = yield from reader.read(8192)
        if not data:
            break
        writer.write(data)

loop = asyncio.get_event_loop()
loop.run_until_complete(echo_server())
try:
    loop.run_forever()
finally:
    loop.close()
于 2014-12-26T19:30:14.090 回答