我已经尝试了多种方法来做到这一点。并且仅在线程中启动 pystray 似乎不会阻止 uvicorn asyncio 操作。我想知道是否有办法使用 asyncio 启动另一个阻塞循环。
这块。无法访问任何服务。
async def start_tray():
print("RUN")
systray.run()
print("EXIT")
if __name__ == '__main__':
loop = asyncio.new_event_loop()
config = Config(app=app, loop=loop, host='127.0.0.1', port=8000, workers=2)
server = Server(config)
loop.create_task(server.serve())
loop.create_task(start_tray())
loop.run_forever()
这是迄今为止唯一有效的方法。当系统托盘设置为停止时,阻塞调用结束,所以我在这里终止进程。这将通过 hypercorn 启动应用程序。
def start_tray():
print("RUN")
systray.run()
print("EXIT")
os.kill(os.getpid(), signal.CTRL_BREAK_EVENT)
if __name__ == '__main__':
update_thread = threading.Thread(target=start_tray)
update_thread.start()
asyncio.run(serve(app, config))
系统托盘代码看起来像
self.icon = icon(settings.SYSTRAY_TITLE,
icon=self.off_icon(),
title=settings.SYSTRAY_TITLE,
menu=menu(
item("Start", self.start),
item("Stop", self.stop),
item("View Log", self.view_log),
item("About", self.aboutWindow),
item("Exit", self.exit)),
)
def run(self):
self.icon.run()