Многопоточность в python не в отдельных функциях
Нужно каким то образом запустить цикл который будет работать параллельно с основной программой.
нашел такой пример использования многопоточности, но тут работают параллельно именно две функции
from threading import Thread
def prescript(thefile, num):
with open(thefile, 'w') as f:
for i in range(num):
if num > 500:
f.write('МногоБукв\n')
else:
f.write('МалоБукв\n')
thread1 = Thread(target=prescript, args=('f1.txt', 200,))
thread2 = Thread(target=prescript, args=('f2.txt', 1000,))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
а у меня есть основной цикл который должен выполняться каждую секунду и проверять значение переменной которая может меняться, но при значении этой переменной = 100, должен параллельно начаться таймер который после 30 секунд будет повторная проверка переменной а, и если а == 100 выведет слово YES.
while True:
a = check_something()
if a == 100:
#тут начинается что то по типу sleep. и через какое то время если переменная a не поменялась то выведет YES
b = custom_timer(time = 30) # custom_timer это функция с циклом внутри который ждёт 30 секунд а затем return a
if b == 100:
print("YES")
хочу реализовать custom_timer() вот так:
import sched, time
s = sched.scheduler(time.time, time.sleep)
s.enter(5, 1, do_something, (s,))
s.run()
Вопрос в том как реализовать что вторая функция таймер будет запускаться параллельно с основным циклом и основной цикл не будет ждать ruturn'a в функции таймер
Ответы (1 шт):
Для решения Вашей задачи Вам надо изучить модуль asyncio!
Для конкрентного Вашего случая нужно использовать asyncio.wait_for
P.S. Я написал очень примерный код, и если задача изменится, тогда и код очень сильно придётся изменить!
Примерный код:
import asyncio
async def do_something():
return 'Какой-то результат функции'
async def task(function, value):
while True:
result = await function
if result == value:
return result
async def main():
await task(do_something(), 100)
try:
result = await asyncio.wait_for(
task(do_something(), 100),
timeout=30.0
)
except asyncio.TimeoutError:
print('Время вышло!')
...
else:
print(result)
...
await main() # Это можно только, если `python3 -m asyncio` в консоли