为什么任务
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'
我想你的意思是:
def aioServerStart(self):
否则外部函数不会执行您期望的操作。