# rpc-backend-python3 **Repository Path**: jiaoyuedave/rpc-backend-python3 ## Basic Information - **Project Name**: rpc-backend-python3 - **Description**: rpc-backend-python3 - **Primary Language**: Python - **License**: MIT - **Default Branch**: v0.3.0-alpha - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-07-27 - **Last Updated**: 2022-10-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rpc-backend-python3 RPC框架Python运行时, 可以作为承载服务的运行时, 也可以作为SDK使用. # 运行时 ## Plato类 - Init(config_path = "config.default.cfg", log_cb = None, proto_config_path = 'rpc_config') - 初始化框架 - 参数 - config_path 框架配置文件路径 - log_cb 外部日志回调 - proto_config_path RPC配置目录 - 返回 - Plato框架引用 - Deinit() - 清理 - run_forever() - 阻塞运行到程序结束, 收到signal.SIGINT, signal.SIGTERM或者调用stop将退出阻塞 - stop() - 停止阻塞循环 - tick_every(usr_gap, func) - 注册一个tick函数'func'每`usr_gap`执行一次 - 参数 - usr_gap 间隔,毫秒 - func 回调函数 - 返回 - TICK ID - cancel_tick(tick_id) - 取消tick - 参数 - tick_id TICK ID - tick - 运行一次主循环 - schedule(f, ret_cb = None) - 启动一个协程, 在主循环内执行, `f`可以为一个生成器 - 参数 - f 生成器 - ret_cb 回调函数,在协程执行完成后调用 - 返回 - 协程实例 - sleep(timeout) - 在协程内调用, 让协程睡眠`timeout`毫秒 - wait() - 让当前协程处于事件等待状态,需要外部调用`resume`来恢复协程运行 - 返回 - 当前正在运行的协程 - coro() - 获取当前协程实例 - new_timer(fn, timeout) - 建立一个定时器, timeout(毫秒)后到期执行函数fn并自动销毁 - new_timer_loop(fn, timeout) - 建立一个循环定时器, 每timeout(毫秒)后到期执行函数fn ## Timer类 - cancel() - 取消定时器 - is_cancel() - 检测定时器是否取消 - get_id() - 获取定时器ID ## Coroutine类 - check_an_throw_ex() - 检查是否有异常,如果有异常则抛出 - cancel() - 取消协程 - set_exec(ex) - 设置协程异常, 调用check_an_throw_ex将抛出异常 # 测试 参考test目录 # 编写协程化扩展 可以编写扩展, 并使用Plato框架调用扩展的协程化函数, 假设类`Demo`完成一个自定义的异步操作, 通过Plato框架转换为一个协程化同步调用方式: ``` #!/usr/bin/python # -*- coding: UTF-8 -*- import plato class Demo: def __init__(self): self._co = None def tick(self): pass def test(self): print("call yield_add...") # 保存当前协程, 后续用于恢复运行 self._co = plato.get_plato().coro() # TODO 异步操作 # ...... # 协程挂起 ret = yield self._co # notify调用后, 方法恢复执行 print("call yield_add...done", ret) self._co = None return ret def notify(self): # 命令返回则恢复协程执行 if self._co: self._co.resume("abc") ``` `ret = yield self._co`会使当前调用的协程挂起, `self._co.resume("abc")`唤醒协程并得到返回值`abc`. 使用Plato框架调用: ``` demo = Demo() def test(): # 调用 ret = yield from demo.test() print(ret) frame.schedule(test()) ``` # SDK SDK在集群外部, 没有参与服务发现/注册, 需要直接连接到运行时进行或网关. SDK版本提供了一个新的函数: - Connect(hosts) - 连接到指定的运行时进程或网关 - 参数 - hosts 地址列表 - 返回 - True 成功 - False 失败 在调用`Init`方法后需要调用`Connect`方法主动连接到远程运行时进程, 其他的使用方式保持一致.