为什么我的 python asyncio 任务在尚未执行的情况下就报告已完成?

问题描述 投票:0回答:1

为什么任务

aioStartServerTask
还没执行就报告已完成?如果任务被执行,日志文件中应该有输出(实际上没有),并且
app.aioServer
应该被初始化,并且不会出现异常。

Python 3.12

from os import path as ospath
import asyncio
import socket as Socket
import logger as log

logger = log.getLogger(fileName=ospath.join('log', 'server.log'), initialize=True)

class App():
    def __init__(self) -> None:
        self.quit = False
        self.aioServer = None
        self.clients = []

    async def clientHandler(self, reader, writer):
        logger.info('client handler starting')

    async def aioServerStart(self):
        logger.info('aioServerStart')
        async def startServer(x=self):
            logger.info('here')
            ipaddr = Socket.gethostbyname(Socket.gethostname())
            port = 32843
            logger.info(f'starting socket server ({ipaddr}:{port})')
            x.aioServer = await asyncio.start_server(self.clientHandler, ipaddr, port=32843)
        return startServer

async def main():
    logger.info("server app starting")
    app = App()
    
    aioStartServerTask = asyncio.create_task(app.aioServerStart())
    logger.info(f'task done: {aioStartServerTask.done()}')
    logger.info('waiting for server to start...')
    await aioStartServerTask
    while not aioStartServerTask.done():
        await asyncio.sleep(.5)
        logger.info('waiting...')
    logger.info(f'task done: {aioStartServerTask.done()}')
    await asyncio.sleep(2)
    await aioStartServerTask
    logger.info('closing server')
    app.aioServer.close()
    await app.aioServer.wait_closed()
    logger.info('server closed')

if __name__ == '__main__':
    asyncio.run(main())

输出:

$ python server.py 
    INFO - 2024-09-29 19:42:49,861 - root - initialized logger - None
    INFO - 2024-09-29 19:42:49,861 - root - server app starting
    INFO - 2024-09-29 19:42:49,861 - root - task done: False
    INFO - 2024-09-29 19:42:49,862 - root - waiting for server to start...
    INFO - 2024-09-29 19:42:49,862 - root - aioServerStart
    INFO - 2024-09-29 19:42:49,862 - root - task done: True
    INFO - 2024-09-29 19:42:51,864 - root - closing server
Traceback (most recent call last):
  File "/home/david/python/opcua/server.py", line 79, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.12/asyncio/runners.py", line 194, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/home/david/python/opcua/server.py", line 74, in main
    app.aioServer.close()
    ^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'close'
python-3.x python-asyncio python-3.12
1个回答
0
投票

我想你的意思是:

def aioServerStart(self):

否则外部函数不会执行您期望的操作。

© www.soinside.com 2019 - 2024. All rights reserved.