异步行为树
async-btree的Python项目详细描述
概述
python的异步行为树
什么是行为树?
Unlike a Finite State Machine, a Behaviour Tree is a tree of hierarchical nodes that controls the flow of decision and the execution of "tasks" or, as we will call them further, "Actions". -- behaviortree
如果您的新的(或不是)关于行为树,您可以花一些时间在这几个链接上:
少数实现库:
- task_behavior_engine用python编写的基于行为树的任务引擎
- pi_trees用于实现行为树的python/ros库
- pr_behavior_tree一个基于协程的简单python行为树库
- btsk行为树启动工具包
- behavepython中的行为树实现
为什么另一个图书馆如此?
当你学习行为树实现,反应节点,动态变化,运行时执行等等的时候… 现在,您或多或少地构建了一个类似于求值器“eval/apply”或编译器的东西,它有一个复杂的类层次集。 所有的复杂性都来自于内部状态管理,使用黑板树来避免全局变量、多线程问题、可能很少的回调等等。 这打破了你最初设计的简单和美丽。
我发现什么对行为树有用:
- 表达清晰
- 节点树表示法
- 重复使用行为的可能性
- 添加外部度量以动态改变行为,这是可观察模式的第一步…
由于我已经使用oop多年(很长一段时间了),我会尽量避免使用类树,更喜欢使用函数编程的能力来获得我想要的东西:在语义结构上添加元数据,处理闭包,在参数或返回值中使用函数……
最后一个更个人化的原因是,我将探讨python的表现力。
因此,在本模块中,我将使用协程的概念及其机制来管理执行流。 这样:
- 我们重用简单的语言习惯用法来管理状态、参数等
- 对动作执行没有设计限制
- 大多数语言构建块都可以重用
您可以构建这样的表达式:
asyncdefa_func():"""A great function"""return"a"asyncdefb_decorator(child_value,other=""):"""A great decorator..."""returnf"b{child_value}{other}"assertrun(decorate(a_func,b_decorator))=="ba"
此表达式对函数a_func
应用b_decorator
。
注意decorate(a_func, b_decorator)
不是异步函数,只有操作或条件是异步函数。
这一实施的几条准则:
- 为了模拟所有的nodestatus(成功、失败、运行),我将其替换为评估值的真实/错误含义。 一个特殊的专用异常修饰标准异常,以便给它们一个错误的含义。
- 黑板模式,作为行为树上下文变量的管理器。 请用Python3…只需使用contextvars!
- 为了能够构建语义树,我在函数实现中引入了一个元数据元组。
剩下的只是实现细节。
一个小提示:
You should not use this until you're ready to think about what you're doing :)
关于“异步”框架的说明
当我们使用异步函数作为底层机制来管理执行流时,标准库asyncio非常好。 但是,你应该读一下Nathaniel J.Smith写的[Amazing Blog Post}(https://vorpus.org/blog/some-thinks-on-asynchronous-api-design-in-a-post-asyncAwait-world/)。 下一步深入研究curio框架。
正如古董所说:
Don't Use Curio if You're Allergic to Curio
就个人而言,经过几次测试和阅读古玩代码,我相当上瘾。
设置
要求
- Python3.7+
安装
将此库直接安装到激活的虚拟环境中:
$ pip install async-btree
或者将其添加到您的Poetry项目:
$ poetry add async-btree
用法
安装后,可以导入包:
$ python >>> import async_btree >>> async_btree.__version__
贡献
你可以在投稿页找到所有信息。