http://asyncio.readthedocs.io/en/latest/tcp_echo.html
中有一个简单的echo tcp服务器示例它是基于协同程序实现的。协程'handle_echo'在主线程中运行。我想知道我是否可以让'handle_echo'在不同的线程中运行:
def handle_echo(reader, writer):
# I can't use await here, guess because it is not coroutine.
data = await reader.read(100)
message = data.decode()
addr = writer.get_extra_info('peername')
print("Received %r from %r" % (message, addr))
print("Send: %r" % message)
writer.write(data)
await writer.drain()
print("Close the client socket")
writer.close()
def call_in_background(target, *args):
loop = asyncio.get_event_loop()
if callable(target):
return loop.run_in_executor(executor, target, args[0], args[1])
raise TypeError("target must be a callable, "
"not {!r}".format(type(target)))
async def handle_echo_wrapper(reader, writer):
call_in_background(handle_echo, reader, writer)
代码看起来非常有线。我不能在'handle_echo'中使用'await',因为它不再是协同程序。
所以我的问题是,是否有必要在多线程模式下生成asyncio tcp服务器?例如。根据CPU数创建工作线程池,并在不同的线程中处理每个客户端。我担心的是单线程和基于协程的服务器会被一些不太好的代码客户端阻止,是否可能?我试图证明它但不成功