Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python是否可以运行脚本的多个实例,每个实例都包含它';谁有自己的数据?_Python_C++_Database_Game Engine - Fatal编程技术网

Python是否可以运行脚本的多个实例,每个实例都包含它';谁有自己的数据?

Python是否可以运行脚本的多个实例,每个实例都包含它';谁有自己的数据?,python,c++,database,game-engine,Python,C++,Database,Game Engine,我正在尝试为游戏引擎设计一个数据结构,并允许脚本语言从中获取数据。由于设计的某些局限性,数据需要存储在程序的C++侧,以类似数据库的结构。主要原因是,我不确定Python的序列化基础是否能够补偿修改者突然添加和删除数据字段 我想知道是否可以调用python脚本,并让它作为自己的对象使用自己的数据?如果不是,你能在不知道运行时的类名称之前从C++实例化Python类吗?< /P> < P>我从来没有用Python工作过。但我认为这是任何编程/脚本语言的主要特性之一:根据需要多次使用函数自身的实例调

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


我想知道是否可以调用python脚本,并让它作为自己的对象使用自己的数据?如果不是,你能在不知道运行时的类名称之前从C++实例化Python类吗?< /P> < P>我从来没有用Python工作过。但我认为这是任何编程/脚本语言的主要特性之一:根据需要多次使用函数自身的实例调用函数。

您所描述的就是嵌入Python解释器。CPython适合这种嵌入,并提供了一些更高级别的点(尽管它主要关注扩展而不是嵌入,但大多数概念都与这两个领域相关)

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

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


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

“我想知道是否可以调用python脚本,并让它作为自己的对象使用自己的数据?”-您是否需要脚本与程序的其余部分处于相同的过程中?如果不需要,这很简单;只需启动整个python过程。否则,您将陷入棘手的事务中;您的问题的答案是“是的,但这很烦人,而且很容易。“数据是什么意思?它是在运行时加载的还是硬编码的?我是说你是怎么把数据放进去的。实际上,如果动态设置数据,则可以运行任意数量的实例,并在每个实例中放置任意数据。但是不应该有意外的静态数据通过这些多个进程共享。@Kevin我需要它在同一个进程中,并且能够访问程序的内存地址。“但这有什么烦人的地方?”双子座基思说,我想这是真的。但对于每个参与者来说,要从数据库中访问其数据,它至少需要存储自己的ID,以便快速进行一些查找。数据是动态的,它将在下一次程序启动之前定义。它是由一个JSON元文件定义的,但如果所有进程都来自同一源代码,则甚至不需要指定标识。只是逐个处理每个数据块。您可以使用本地数据库或缓存(如redis)来存储这些数据,并在以后同时使用这些数据。当然,您可能需要标记每个数据块的状态,以指示它是否已被处理。我会给您一个加号,但堆栈溢出显然不允许您在任何子类别中没有良好声誉的情况下这样做。我同意Python的速度很慢,但在它的用例中,如果它所做的只是游戏逻辑的话,这可能不是问题。但是,天哪,这实际上给了我更多的思考,因为它看起来在实现python时比我最初想象的更具侵入性。