0

我已经尝试了多种方法来做到这一点。并且仅在线程中启动 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()
4

0 回答 0