【问题标题】:python 3.6 coroutine was never awaited从未等待过python 3.6协程
【发布时间】:2017-03-30 17:14:16
【问题描述】:

所以当我运行我的程序并使用 echo 客户端连接到它时,它会给我这个错误。

Starting server
Serving on ('127.0.0.1', 8881)
Exception in callback UVTransport._call_connection_made
handle: <Handle UVTransport._call_connection_made>
Traceback (most recent call last):
File "uvloop/cbhandles.pyx", line 52, in uvloop.loop.Handle._run (uvloop/loop.c:48414)
File "uvloop/handles/tcp.pyx", line 141, in uvloop.loop.TCPTransport._call_connection_made (uvloop/loop.c:80488)
File "uvloop/handles/basetransport.pyx", line 140, in uvloop.loop.UVBaseTransport._call_connection_made (uvloop/loop.c:65774)
File "uvloop/handles/basetransport.pyx", line 137, in uvloop.loop.UVBaseTransport._call_connection_made (uvloop/loop.c:65671)
AttributeError: 'coroutine' object has no attribute 'connection_made'
/home/kenton/Programming/bridal/bridal-middle/middle/lib/server.py:16:RuntimeWarning: coroutine 'handle_request' was never awaited
loop.run_forever()

据我所知,我应该等待的一切都在等待。 代码如下:

class Server:

    def __init__(self, port):
        asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
    loop = asyncio.get_event_loop()
    server = loop.run_until_complete(self.init(loop))

    print("Serving on {}".format(server.sockets[0].getsockname()))
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        print("\rclosing the server")
        pass

    server.close()
    loop.run_until_complete(server.wait_closed())
    loop.close()

    async def init(self, loop):
        server = await loop.create_server(self.handle_request, '127.0.0.1', 8881)
        return server

    async def handle_request(self):
        print(datetime.datetime.now())
        reader = asyncio.StreamReader()
        writer = asyncio.StreamWriter()
        data = await reader.read(100)
        message = data.decode()
        addr = writer.get_extra_info('peername')
        code = message.partition('-')
        if code[0].startswith("1") or code[0].startswith("5"):
            accounts = lib.settings.database.accounts
            if code[0] == "101":
                result = await self.login_101(code, accounts, writer)
            if code[0] == "501":
                result = await accounts.find_one({"username":code[2]})
                print("looking up", code[0])
            #code logic to keep asking for a valid username if one exists
                if result is None:
                    username = code[2]
                    print(username, " does not exist. Creating")
                    writer.write(b"0")
                    await writer.drain()
                    data = await reader.read(100)
                    message = data.decode()
                    code = message.partition('-')
                    post = {"username":username,"password":code[0],"email":code[2]}
                    post_id = await accounts.insert_one(post).inserted_id
                    writer.write(b(post_id))
                    await writer.drain()
        print("Closed the client socket")
        writer.close()
        print(datetime.datetime.now())

【问题讨论】:

  • 你的缩进看起来很乱。先解决这个问题。
  • 它会一直运行,直到你调用了handle_request方法。如果缩进搞砸了,能指出来吗?
  • __init__ 的大部分正文缩进错误,例如。

标签: python python-3.x python-asyncio python-3.6


【解决方案1】:

关于你的错误信息,实际的错误是:

AttributeError: 'coroutine' object has no attribute 'connection_made'

下面的行只是一个警告 (RuntimeWarning: coroutine 'handle_request' was never awaited)。

您可能会将asyncio.start_serverloop.create_server() 混合使用。

loop.create_server() 的第一个参数是 protocol_factory,它是一个可调用的,它返回一个 Protocol 的实例(而不是上面代码中的协程):

import asyncio

class MyProtocol(asyncio.Protocol):
    def connection_made(self, transport):
        print("Connection made", transport)

    def data_received(self, data):
        print("Data received", data)

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

查看完整的回显服务器示例here

【讨论】:

  • 谢谢你让我准备好了。我只是想知道这些函数(data_received 和 connection_made)是否异步运行。我知道您通常必须在函数声明之前添加 async 以使其异步,所以我想知道这些是否是?
猜你喜欢
  • 2021-02-23
  • 1970-01-01
  • 2020-07-03
  • 2020-10-10
  • 2018-06-05
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 2022-07-19
相关资源
最近更新 更多