0

我正在用 Rust 编写一个游戏,每个玩家都可以向服务器提交一些 python 脚本,以便自动执行游戏中的各种任务。我计划使用pyo3从 rust 中运行 python。

但是,如果玩家提交这样的脚本,我会看到一个问题:

def on_event(e):
    while True:
        pass

现在,当服务器调用函数(使用类似的东西PyAny::call1())时,线程将在到达无限循环时挂起。

我的第一个想法是一次pyo3执行 python 一个语句,因此如果脚本运行超过某个阈值则能够退出,但我认为不pyo3支持这一点。

我的下一个想法是给每个玩家自己的线程来运行他们自己的脚本,这样如果他们的一个脚本卡住了,它只会影响他们的游戏玩法。但是,当线程陷入无限循环时,我仍然遇到无法杀死线程的问题——如果很多玩家提交了刚刚循环的脚本,很多线程将开始使用大量 CPU 时间。

我所需要的只是以某种方式执行 python 脚本,如果其中一个确实循环,它根本不会影响服务器的性能。

谢谢 :)

4

1 回答 1

0

一种解决方案是限制您给每个用户脚本运行的时间。

您可以通过PyThreadState_SetAsyncExc来完成,请参阅此处获取一些代码。它使用解释器的 C 调用,您可能可以在 Rust 中访问它(使用 PyO3 FFI 魔法)。

另一种方法是在操作系统级别执行此操作:如果您为用户脚本生成一个进程,然后在它运行时间过长时将其终止。如果您限制进程可以访问的内容(通过一些操作系统调用),这可能会更安全,但需要一些样板来在主机之间进行通信。

于 2021-11-28T22:09:43.587 回答