gpt4 book ai didi

Python:为方法调用计时并在超过时间时停止它

转载 作者:太空宇宙 更新时间:2023-11-03 12:43:04 25 4
gpt4 key购买 nike

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

exec(source) #source includes run() definition
result = run(params)
#do stuff with result

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

对如何进行有什么建议吗?

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

最佳答案

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

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

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

关于Python:为方法调用计时并在超过时间时停止它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1477569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com