Я бы назвал foo(n), но остановил его, если он работает более 10 секунд. Какой хороший способ сделать это?
Я вижу, что теоретически могу изменить foo сам, чтобы периодически проверять, как долго он работает, но я бы предпочел не делать этого.
Ответ 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)
Тайм-аут не очень точен, но может делать, если вам не нужна предельная точность.
Другой способ - использовать модуль ресурсов и установить максимальное время процессора.