【发布时间】:2015-07-31 09:09:47
【问题描述】:
这是来自 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之前,您还可以使用loop.call_soon在循环开始之前安排回调。这会涵盖您的用例,还是您想运行一些根本不与asyncio交互的其他代码? -
从这个问题中并不清楚你想做的“其他事情”是什么。您需要在上面包含的示例代码中添加什么?
-
我的基本问题是:如何使用 python3 启动非阻塞侦听服务器以通过网络进行客户端-服务器通信?我的第一种方法是启动第二个进程,一直监听并在 multiprocessing.queue 中写入传入消息。但是(我想)也许有一个库可以让它更容易和“更好”?
标签: python python-asyncio