многопроцессорная обработка |поймать выходящего переводчика - PullRequest
3 голосов
/ 22 июля 2011

Я работаю над проблемой эволюционных вычислений, которую я реализую с помощью превосходного модуля ECSPY . Значение фитнеса, которое я использую, получено из довольно сложного моделирования динамики. Дело в том, что мне не нравится подход, который делает мою симуляцию защищенной от бомб; это довольно бесполезно, так как эволюционный процесс может привести к ситуациям, которые движок simu просто не способен решить. Тем не менее, ограничение генератора для возврата сцен, которые разрешимы, слишком ограничено.

Так что мой подход прост; если симуляция займет слишком много времени или вылетит, ну, Я просто позволю милости Дарвина справиться с этим .

Я использую многопроцессорный модуль для оценки пригодности кандидатов. Как мне поймать интерпретатора segfaulting или убить его за несколько секунд?

Большое спасибо заранее,

-jf

1 Ответ

3 голосов
/ 22 июля 2011

Используйте 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()

Нечто подобное может сработать. У него есть состояние гонки, если случается, что он выходит прямо в интервале времени ожидания; убийство может закончиться неудачей.

...