Есть много предложений, но никто из них не использует concurrent.futures, который, по моему мнению, является наиболее понятным для этого способом.
from concurrent.futures import ProcessPoolExecutor
# Warning: this does not terminate function if timeout
def timeout_five(fnc, *args, **kwargs):
with ProcessPoolExecutor() as p:
f = p.submit(fnc, *args, **kwargs)
return f.result(timeout=5)
Супер просто читать и поддерживать.
Мы создаем пул, отправляем один процесс, а затем дождаемся до 5 секунд, прежде чем поднимать TimeoutError, который вы могли бы поймать и обработать, но вам нужно.
Родной для python 3.2+ и backported до 2.7 (
Переключение между потоками и процессами так же просто, как замена ProcessPoolExecutor
на ThreadPoolExecutor
.
Если вы хотите завершить процесс по таймауту, я бы предложил посмотреть в Pebble .
, чтобы избежать предупреждения, вы должны сделать что-то подобное
if(isset($args['myargs']['custom_value'])) {
if (is_numeric($args['myargs']['custom_value'])) {
echo 'Yes';
} else {
echo 'No';
}
}
Что происходит
PHP видит, что вы пытаетесь использовать элемент массива, который не установлен, поэтому он предупреждает вас об этом. Это не серьезно в этом случае, но вы хотите научиться избегать сообщений.
Решение
Функция isset
проверит, определен ли ключ массива.
//You must first of all test isset and then is_numeric,
// else you still get the error. Research 'short circuiting' in php
if ( isset($args['myargs']['custom_value']) && is_numeric($args['myargs']['custom_value'])) {
echo 'Yes';
} else {
echo 'No';
}
Это решение также выведет «Нет», если ключ массива никогда не определялся.
также вы можете
error_reporting(0)
в начале php файла