Python:对方法调用进行计时,如果超过时间则停止它

Ash*_*Ash 3 python multithreading

我需要动态加载代码(作为源代码),运行它并获取结果。我加载的代码始终包含一个 run 方法,该方法返回所需的结果。一切看起来都非常简单,就像在 Python 中一样,因为我可以做

exec(source) #source includes run() definition
result = run(params)
#do stuff with result
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,动态生成的代码中的 run() 方法可能无法终止,因此我只需要运行它最多 x 秒。我可以为此生成一个新线程,并指定 .join() 方法的时间,但随后我无法轻松地从中获取结果(或者我可以)。性能也是一个需要考虑的问题,因为所有这些都是在很长的 while 循环中发生的

关于如何继续的任何建议?

编辑:根据 dcrosta 的请求清除问题:加载的代码不是不受信任的,而是在计算机上自动生成的。这样做的目的是遗传编程。

Ale*_*lli 5

唯一“真正好的”解决方案——基本上不施加任何开销——将基于 SIGALRM,无论是直接的还是通过一个很好的抽象层;但正如已经说过的,Windows 不支持这一点。线程没有用,不是因为很难得到结果(对于队列来说,这将是微不足道的!),而是因为以良好的跨平台方式强行终止失控线程是不可行的。

这使得高开销multiprocessing成为唯一可行的跨平台解决方案。您需要一个进程池来减少进程生成的开销(因为可能只是偶尔需要终止失控函数,大多数时候您可以通过向现有进程发送要执行的新函数来重用现有进程)。同样,队列(多处理类型)使获取结果变得容易(尽管比线程情况要谨慎一些,因为在多处理情况下可能会出现死锁)。

如果您不需要严格序列化函数的执行,而是可以安排您的架构来并行尝试其中两个或多个函数,并且在多核计算机(或快速 LAN 上的多台计算机)上运行,然后,突然间,多处理成为一种高性能解决方案,可以轻松收回生成和 IPC 开销等,正是因为您可以利用尽可能多的处理器(或集群中的节点)。