Как остановить функцию через 5 секунд?
def get_data():
def countdown():
time.sleep(5)
print('bed')
continue
def main():
check = Timer(30.0, countdown)
pars = Thread(target=get_data)
check.start()
pars.start()
check.cansle()
for accaunt in bd:
name = accaunt.split(':')[0]
pas = accaunt.split(':')[1]
user = wa(name)
main()
Каким образом это можно воплотить, задача: get_data может зависнуть, но если сработает, то успеет исполниться быстрее 5 секунд. По моей логике countdown запускается раньше get_data и спит 5 секунд. Если get_data сработала, countdown отменится, а если зависнет, countdown должна вызвать continue для цикла и вынудить его перейти к проверке следующего элемента. На сколько это реально, и как вызвать этот continue?
Ответы (2 шт):
Автор решения: GrAnd
→ Ссылка
Можно попробовать вот так:
import multiprocessing
import time
def get_data(x, n):
for i in range(1, n+1):
print(f"{x}: Get Data {i} of {n}")
time.sleep(1)
def main(x, n):
p = multiprocessing.Process(target=get_data, args=(x,n))
p.start()
p.join(5) # ждём не более 5 секунд
if p.is_alive(): # если поток всё ещё выполняется
print(f"[{x}: {n}] Timeout!!! Kill 'em all :-E")
p.terminate()
p.join()
for account,n in [("my", 10), ("your", 3), ("their", 1)]:
main(account, n)
my: Get Data 1 of 10
my: Get Data 2 of 10
my: Get Data 3 of 10
my: Get Data 4 of 10
my: Get Data 5 of 10
[my: 10] Timeout!!! Kill 'em all :-E
your: Get Data 1 of 3
your: Get Data 2 of 3
your: Get Data 3 of 3
their: Get Data 1 of 1
Автор решения: The Very Guy
→ Ссылка
@GrAnd спасибо, твой вариант вполне приемлемо работает у меня.
А это то что успел найти я:
from wrapt_timeout_decorator import
def get_data():
@timeout(5)
def main():
get_data()
for accaunt in bd:
name = accaunt.split(':')[0]
pas = accaunt.split(':')[1]
user = wa(name)
main()