【问题标题】:multiprocessing | catching an exiting interpreter多处理 |抓住一个退出的口译员
【发布时间】:2011-07-22 14:35:50
【问题描述】:

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

所以我的方法很简单;如果模拟时间过长或崩溃,那么,I'll just let Darwin's mercy handle it

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

非常感谢,

-jf

【问题讨论】:

    标签: python segmentation-fault multiprocessing evolutionary-algorithm


    【解决方案1】:

    使用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()
    

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

    【讨论】:

    • 酷,感谢您的建议,我会看看这如何应用于多处理模块。不过,我想知道如果在民意调查之间由 Popen 段错误分叉的解释器会发生什么?
    • @Jelle:它退出了。一般。下一次民意调查发现了这一点。试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多