结合 Python Cement 和 asyncio

Combining Python Cement with asyncio

正在寻找有关如何结合 python 水泥框架 (http://builtoncement.com/) with asyncio (https://docs.python.org/3.4/library/asyncio.html) 的一些指示。

我有一个基于 asyncio 的事件引擎,运行 对进步和简单性感到非常满意。表现也不错。

现在我需要添加更复杂的处理程序、挂钩和插件并浏览我发现的各种选项,水泥似乎是我的最爱并且也得到了很好的维护。

我喜欢它处理日志记录、配置、参数、输出和插件的事实。

但是我找不到将 asyncio 与 cement 框架一起使用的示例。

无论是否可能、建议甚至是 cement 的替代品(与 asyncio 一起工作)的任何观点都将非常受欢迎。

谢谢!

对于大多数部分来说,将 cement 与 asyncio 集成起来非常容易。我发现的最佳方法是使用您自己的实例扩展 CementApp 并利用 setup() 获取循环并在需要时注册额外的线程池。

注册一个 _post_run 钩子允许你执行初始化生成器的 run_until_complete

在注册 _pre_close 挂钩时,您可以完成所有挂起的异步任务。

一个 _init() 和 _finish() 协程完成剩下的工作,主要的应用程序逻辑归结为:

with myApp('myAppName') as app:
    app.run()
    app.log.info('Starting MyApp')

    try:
        app.run_forever()
    except (KeyboardInterrupt, SystemExit, CaughtSignal):
        app.log.info('Shutting down MyApp')

        app.close()

您可以在这里找到一个工作示例:https://github.com/fxstein/SentientHome/blob/master/engine/event.engine.py