Python可以运行脚本的多个实例,每个实例都包含它自己的数据吗?

时间:2016-06-10 05:16:52

标签: python c++ database game-engine

我正在尝试为游戏引擎设计数据结构,并允许脚本语言从中获取数据。由于设计的一些限制,数据需要在数据库结构中存储在程序的C ++端。主要原因是我不确定Python的序列化基础是否可以补偿修改者突然添加和删除数据字段。

我想知道是否可以调用python脚本,并让它作为自己的对象使用它自己的数据?如果没有,你可以在不知道类的名称直到运行时从C ++实例化一个python类吗?

2 个答案:

答案 0 :(得分:1)

您所描述的内容称为嵌入Python解释器。 CPython适用于这种嵌入,并且在一些更高级别的点上提供a nice tutorial(尽管它主要关注扩展而不是嵌入,大多数概念都与这两个区域相关)。

然而,这种方法存在许多缺点。特别是,与C ++相比,CPython相当慢。你应该假设执行任意Python字节码会阻塞一段不合理的时间,除非你已经对它进行了分析并且知道你可以逃脱它。更糟糕的是,每个Python解释器(过程中的can have more than one,有一些警告)都有一个全局解释器锁(GIL),除非你持有它的GIL,否则你通常不能与Python解释器交互。换句话说,一次只允许一个线程调用给定的Python解释器,这使得用线程管理Python的执行速度变得更加困难。它还意味着即使Python代码为embarrassingly parallel,您也可以通过提供Python额外线程获得无速度加值。唯一的主要例外是I / O绑定操作,Python通常可以在不保存GIL的情况下执行操作。

另一个困难是Python对象都是PyObject*类型。这些(指向)引用计数对象具有许多有趣的属性,但关键是你不能直接将原始内存提供给Python脚本并期望它能够工作。您至少必须将其包装在array或其他合适的Python对象中。如果您希望底层内存仍属于您的应用程序,您可能希望使用buffer protocolarray和朋友可以使用的标准方式公开此内存(这样您就不会最终不必要地复制内存。

在高层次上,我建议使用一个或多个专用的Python工作线程(每个解释器一个,并且尽量不要旋转太多的解释器,因为它们是重型对象),并且在这些线程之间异步传递工作对象其余的申请。工作线程负责在C ++对象和Python对象之间进行转换,保存GIL,以及运行缓慢的Python代码。您还应该记住,Python将使用与应用程序其余部分相同的计算资源(CPU,内存,可能是磁盘I / O)。线程可以帮助您使用多个内核,但它不会为您购买比您实际使用的CPU更多的CPU。您可能只是发现Python对于您的应用程序来说太慢了,这取决于您需要脚本系统的响应速度以及您的其余游戏引擎能够容忍额外的CPU绑定线程的性能压力。您应该首先构建一个小型原型并在尝试构建真实的东西之前验证它具有可接受的性能特征,或者如果您已经拥有完整的游戏引擎,请尝试将最小的Python解释器用螺栓连接并运行一些基准测试。

答案 1 :(得分:-1)

我从未使用过python。但我认为这是任何编程/脚本语言的主要特性之一:根据需要多次使用它自己的实例调用一个函数。