3

我正在研究一个进化计算问题,我正在使用出色的ECSPY模块来实现它。我使用的适应度值来自一个非常复杂的动力学模拟。问题是我不喜欢让我的模拟炸弹防弹的方法;它非常没用,因为进化过程可能会出现simu引擎无法解决的情况。然而,约束生成器返回可解决的场景是过度约束的事情。

所以我的方法很简单;如果模拟时间太长,或者崩溃,好吧,我会让达尔文的仁慈处理它

我正在使用多处理模块来评估候选人的适合度。如何在几秒钟内捕获一个有段错误的解释器或杀死它?

提前谢谢了,

-jf

4

1 回答 1

3

用于subprocess在 Python 脚本中“包装”Python 解释器。

  • 启动一个运行你的东西的 Python 解释器。

  • 启动一个时钟。

  • 等到时钟用完或子进程崩溃。

简单而懒惰的方法是定期轮询子进程以查看它是否已经死亡。是的,它是“忙于等待”,但是如果您不想在子流程完成时立即通知,它实现起来很简单并且资源成本相对较低。

import subprocess
import time
timeout = # your timeout interval
real_work= subprocess.Popen( "python the_real_work.py" )
start= time.time()
status= real_work.poll()
while time.time()-start < timeout and not status:
    time.sleep( 10.0 )
    status= real_work.poll()
if not status: 
    real_work.kill()

类似的事情可能会奏效。如果它恰好在超时间隔内退出,则它具有竞争条件;杀戮可能会失败。

于 2011-07-22T15:54:31.550 回答