基于异步服务的编程。
mode的Python项目详细描述
什么是模式?
mode是建立在asyncio之上的一个非常小的python库,它使 使用起来容易得多。
在模式下,你的程序是建立在服务之上的,你可以启动,停止, 重新启动并监督。
服务只是一个类:
class PageViewCache(Service): redis: Redis = None async def on_start(self) -> None: self.redis = connect_to_redis() async def update(self, url: str, n: int = 1) -> int: return await self.redis.incr(url, n) async def get(self, url: str) -> int: return await self.redis.get(url)
服务被启动、停止和重新启动,并且 对这些操作进行回调。
它可以启动另一项服务:
class App(Service): page_view_cache: PageViewCache = None async def on_start(self) -> None: await self.add_runtime_dependency(self.page_view_cache) @cached_property def page_view_cache(self) -> PageViewCache: return PageViewCache()
它可以包括后台任务:
class PageViewCache(Service): @Service.timer(1.0) async def _update_cache(self) -> None: self.data = await cache.get('key')
依赖于其他服务的服务实际上形成了一个图 你可以想象出来。
< DL>模式可选地提供一个可用于启动程序的辅助进程, 支持日志记录、阻塞检测、远程调试等功能。
要启动工作程序,请将此添加到您的程序中:
if __name__ == '__main__': from mode import Worker Worker(Service(), loglevel="info").execute_from_commandline()
然后执行程序启动工作程序:
$ python examples/tutorial.py [2018-03-27 15:47:12,159: INFO]: [^Worker]: Starting... [2018-03-27 15:47:12,160: INFO]: [^-AppService]: Starting... [2018-03-27 15:47:12,160: INFO]: [^--Websockets]: Starting... STARTING WEBSOCKET SERVER [2018-03-27 15:47:12,161: INFO]: [^--UserCache]: Starting... [2018-03-27 15:47:12,161: INFO]: [^--Webserver]: Starting... [2018-03-27 15:47:12,164: INFO]: [^--Webserver]: Serving on port 8000 REMOVING EXPIRED USERS REMOVING EXPIRED USERS
要停止它,请点击control-c
[2018-03-27 15:55:08,084: INFO]: [^Worker]: Stopping on signal received...
[2018-03-27 15:55:08,084: INFO]: [^Worker]: Stopping...
[2018-03-27 15:55:08,084: INFO]: [^-AppService]: Stopping...
[2018-03-27 15:55:08,084: INFO]: [^--UserCache]: Stopping...
REMOVING EXPIRED USERS
[2018-03-27 15:55:08,085: INFO]: [^Worker]: Gathering service tasks...
[2018-03-27 15:55:08,085: INFO]: [^--UserCache]: -Stopped!
[2018-03-27 15:55:08,085: INFO]: [^--Webserver]: Stopping...
[2018-03-27 15:55:08,085: INFO]: [^Worker]: Gathering all futures...
[2018-03-27 15:55:08,085: INFO]: [^--Webserver]: Closing server
[2018-03-27 15:55:08,086: INFO]: [^--Webserver]: Waiting for server to close handle
[2018-03-27 15:55:08,086: INFO]: [^--Webserver]: Shutting down web application
[2018-03-27 15:55:08,086: INFO]: [^--Webserver]: Waiting for handler to shut down
[2018-03-27 15:55:08,086: INFO]: [^--Webserver]: Cleanup
[2018-03-27 15:55:08,086: INFO]: [^--Webserver]: -Stopped!
[2018-03-27 15:55:08,086: INFO]: [^--Websockets]: Stopping...
[2018-03-27 15:55:08,086: INFO]: [^--Websockets]: -Stopped!
[2018-03-27 15:55:08,087: INFO]: [^-AppService]: -Stopped!
[2018-03-27 15:55:08,087: INFO]: [^Worker]: -Stopped!
我们传递给服务的 信标对象跟踪服务 在图表中。
它们不是严格要求的,但可以用于可视化跑步 例如,我们可以将其渲染为一个漂亮的图形。
这要求您拥有 pydot 库和graphviz 已安装:
$ pip install pydot
让我们更改app服务类以将图形转储到图像 启动时:
class AppService(Service): async def on_start(self) -> None: print('APP STARTING') import pydot import io o = io.StringIO() beacon = self.app.beacon.root or self.app.beacon beacon.as_graph().to_dot(o) graph, = pydot.graph_from_dot_data(o.getvalue()) print('WRITING GRAPH TO image.png') with open('image.png', 'wb') as fh: fh.write(graph.create_png())