Скажем, у меня есть долго работающая функция Python, которая выглядит примерно так?
import random
import time
from rx import Observable
def intns(x):
y = random.randint(5,10)
print(y)
print('begin')
time.sleep(y)
print('end')
return x
Я хочу иметь возможность установить тайм-аут 1000ms
.
Итак, я делаю что-то вроде создания наблюдаемого и отображения его с помощью вышеупомянутых интенсивных вычислений.
a = Observable.repeat(1).map(lambda x: intns(x))
Теперь для каждого испускаемого значения, если это занимает более 1000 мс, я хочу завершить наблюдаемое, как только я достигну 1000ms
, используя on_error
или on_completed
a.timeout(1000).subscribe(lambda x: print(x), lambda x: print(x))
приведенный выше оператор действительно получает тайм-аут и вызывает on_error
, но он продолжает вычислять интенсивные вычисления и только затем возвращается к следующим операторам. Есть ли лучший способ сделать это?
Последний оператор печатает следующее
8 # no of seconds to sleep
begin # begins sleeping, trying to emit the first value
Timeout # operation times out, and calls on_error
end # thread waits till the function ends
Идея состоит в том, что если время ожидания определенной функции истекло, я хочу иметь возможность продолжить свою программу и игнорировать результат.
Мне было интересно, была ли функция intns
выполнена в отдельном потоке, я думаю, что основной поток продолжает выполнение после тайм-аута, но я все еще хочу остановить вычисление функции intns
в потоке или как-то убить ее.