hekkaaa
@hekkaaa
Junior DevOps

Почему поток в Python работает асинхронно?

Привет!
У меня небольшой затык с потоками Python.
Я использую обычный модуль threading для запуска функции в виде "демона". при старте сервера на Flask.
Сама функция имеет внутри себя еще логику и ряд функции вызываемой этой логикой перемешанных друг с другом.

Получается так что в логе я вижу дикую смесь асинхронных запусков функции все логики которую я прописал.
Протестировав запуск моей функции отдельно по частям и вместе без внесения в threading все отлично работает.

Моя функция делает примерно следующее (ОСТОРОЖНО ПСЕВДОКОД):
def start()
if "файл есть" == 'файл есть':
  while True :
  записываем данные в файл с последней точки (вызываем функцию b1).
else:
 создаем файл (вызываем функцию a1)
 наполняем файл данными (вызываем функцию a2)
 логика проверки даты и времени в записях и т.д. (вызываем функцию a3)
 while True :
    бесконечный цикл наполнения файла последней информацией.(вызываем функцию b1)

flow1 = Thread(target=start, daemon=True)
flow1.start()


Что я вижу в логах при запуске потока: Файла нет -> идет ветка создания файла -> резко в логе появляется информация из логической ветки выше (та где при условии файл есть) О_о и начинает наполнять последними данными. (параллельно идет ветка первичного наполнения файла данными. ) Далее завершая работа функции создания-первичного наполнения и продолжается обычная работа бесконечного цикла по обновлению.
Итог данные тупо перемешиваются в полный хаос, в логах та же беда, а дальше цикл наполняет его нормально как мне нужно.

Хотел бы узнать как управлять этой асинхронностью когда у тебя 1 всего то 1 поток?
Или есть какой то нюанс при работе с внутренними функциями?
Буду благодарен за практические примеры решения подобной проблемы.
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
hekkaaa
@hekkaaa Автор вопроса
Junior DevOps
Решение следущее. Нашел ответ в Как лучше организовать два потока исполнения внутри Flask?

Проблема в том что в Flask уже есть поток и из-за этого происходит вот такая петрушка как у меня. Получается у меня уже 2 потока и Flask уже как то сам крутит ими.

Решение: Сделать в ручную отдельно поток run() и свой

app = Flask(__name__)

@app.route('/')
def hello_world():
    return render_template('index.html')

flow1 = Thread(target=app.run)
flow2 = Thread(target=momowwind, daemon=True)

flow1.start()
flow2.start()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alfss
@alfss
  1. Запустить все в дебаге и разобраться почему так
  2. Отказаться от потоков
  3. Пересмотреть архитектуру решения


По псевдокоду проблем не видно, значит реальный код не такой. Или в доп функциях есть циклические вызовы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы