gpt4 book ai didi

python - 异步: Start a non-blocking listening server

转载 作者:行者123 更新时间:2023-12-01 04:35:47 36 4
gpt4 key购买 nike

这是 asyncio tutotial 中的基本 tcp 服务器:

import asyncio

class EchoServerClientProtocol(asyncio.Protocol):
def connection_made(self, transport):
peername = transport.get_extra_info('peername')
print('Connection from {}'.format(peername))
self.transport = transport

def data_received(self, data):
message = data.decode()
print('Data received: {!r}'.format(message))

print('Send: {!r}'.format(message))
self.transport.write(data)

print('Close the client socket')
self.transport.close()

loop = asyncio.get_event_loop()
# Each client connection will create a new protocol instance
coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888)
server = loop.run_until_complete(coro)

# Serve requests until CTRL+c is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
loop.run_forever()
except KeyboardInterrupt:
pass

# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()

像所有(我发现的)其他示例一样,它使用阻塞loop.run_forever()。
我如何开始列出服务器并同时做其他事情?
我尝试在函数中外包启动服务器并使用 asyncio.async() 启动该函数,但没有成功。我在这里缺少什么?

最佳答案

您可以在调用loop.run_forever()之前安排多个并发异步任务。

@asyncio.coroutine
def other_task_coroutine():
pass # do something

start_tcp_server_task = loop.create_task(loop.create_server(
EchoServerClientProtocol, '127.0.0.1', 8888))

other_task = loop.create_task(other_task_coroutine())

self.run_forever()

当你调用loop.create_task(loop.create_server())loop.create_task(other_task_coroutine())时,实际上什么都没有执行:创建协程对象并将其包装在任务中(将任务视为 shell,协程是将在任务中执行的代码的实例)。任务在创建时就被安排在循环中。

循环将首先执行 start_tcp_server_task(因为它首先被调度),直到阻塞 IO 事件待处理或被动套接字准备好监听传入连接。

您可以将 asyncio 视为在一个 CPU 上运行的非抢占式调度程序:一旦第一个任务自行中断或完成,就会执行第二个任务。因此,当执行一项任务时,另一项任务必须等待,直到正在运行的任务完成或让出(或在 Python 3.5 中“等待”)。 “yielding”(yield from client.read())或“awaiting”(await client.read())意味着任务将手交还给循环的调度程序,直到可以执行client.read()(数据在套接字上可用)。

一旦任务将控制权交还给循环,它就可以调度其他挂起的任务,处理传入的事件并调度正在等待这些事件的任务。一旦没有什么可做的,循环将执行进程唯一的阻塞调用: sleep ,直到内核通知它事件已准备好处理。

在这种情况下,您必须了解,使用 asyncio 时,进程中运行的所有内容都必须异步运行,以便循环可以完成其工作。您不能在循环中使用多处理对象。

请注意,asyncio.async(coroutine(), Loop=loop) 相当于 loop.create_task(coroutine())

关于python - 异步: Start a non-blocking listening server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31742332/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com