Остановить код после периода времени - программирование
Подтвердить что ты не робот

Остановить код после периода времени

Я бы назвал foo(n), но остановил его, если он работает более 10 секунд. Какой хороший способ сделать это?

Я вижу, что теоретически могу изменить foo сам, чтобы периодически проверять, как долго он работает, но я бы предпочел не делать этого.

4b9b3361

Ответ 1

Здесь вы идете:

import multiprocessing
import time

# Your foo function
def foo(n):
    for i in range(10000 * n):
        print "Tick"
        time.sleep(1)

if __name__ == '__main__':
    # Start foo as a process
    p = multiprocessing.Process(target=foo, name="Foo", args=(10,))
    p.start()

    # Wait 10 seconds for foo
    time.sleep(10)

    # Terminate foo
    p.terminate()

    # Cleanup
    p.join()

Это будет ждать 10 секунд для foo, а затем убьет его.

Обновление

Завершить процесс, только если он запущен.

# If thread is active
if p.is_alive():
    print "foo is running... let kill it..."

    # Terminate foo
    p.terminate()

Обновление 2: рекомендуется

Используйте join с timeout. Если foo заканчивается до истечения таймаута, main может продолжаться.

# Wait a maximum of 10 seconds for foo
# Usage: join([timeout in seconds])
p.join(10)

# If thread is active
if p.is_alive():
    print "foo is running... let kill it..."

    # Terminate foo
    p.terminate()
    p.join()

Ответ 2

import signal

#Sets an handler function, you can comment it if you don't need it.
signal.signal(signal.SIGALRM,handler_function) 

#Sets an alarm in 10 seconds
#If uncaught will terminate your process.
signal.alarm(10) 

Тайм-аут не очень точен, но может делать, если вам не нужна предельная точность.

Другой способ - использовать модуль ресурсов и установить максимальное время процессора.