Python asyncio-在无限循环中启动协程

时间:2019-11-23 13:37:51

标签: python python-asyncio

我正在用Python开发一个简单的服务器/客户端聊天程序。该程序应允许多个用户一次连接,然后并发执行他们的请求。为此,我正在使用asyncio模块和sockets

async def accept_new_connections(socket):
    socket.listen(1)
    while True:
        connection, client_address = sock.accept()
        print("accepted conn")
        asyncio.create_task(accept_commands(socket, connection))

async def accept_commands(socket, connection):
    print("accept cmd started")
    while True:
        # get and execute commands

def main():
    asyncio.run(accept_new_connections(socket))

main()

我希望为每个连接运行accept_commands,然后将同时执行命令。但是,当前代码仅对第一个连接启动accept_commands,并阻塞while循环(accept_new_connections中的那个)。 知道要为每个连接启动accept_command时需要更改什么吗?

1 个答案:

答案 0 :(得分:1)

很难说出来,因为您的示例确实实现了accept_commands,但是基于您的问题,您可能需要在事件循环本身上使用异步套接字方法,以便协程可以产生执行和让其他事情发生。

以下示例显示了如何执行此操作。这将在端口8080上启动套接字,并将接收到的所有数据发送回客户端。通过将两个客户端与netcattelnet连接并发送数据,您可以同时看到此工作。

import asyncio
import socket

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

socket.bind(('localhost', 8080))
socket.listen(1)
socket.setblocking(False)
loop = asyncio.new_event_loop()

async def main():
    while True:
        connection, client_address = await loop.sock_accept(socket)
        print('connected')
        loop.create_task(accept_commands(connection))


async def accept_commands(connection):
    while True:
        request = await loop.sock_recv(connection, 16)
        await loop.sock_sendall(connection, request)


loop.run_until_complete(main())