Долго выполняющаяся задача Python в потоке не работает внутри Docker

Я пытаюсь развернуть свой сайт. Более или менее я подключил все внутри докера, и БД отлично работает с моим кодом на Python.

Однако внутри моего кода у меня есть длинный поток. Это должно обновлять базу данных каждые 15 минут. это код.

import time
import threading
import traceback


class PeriodicTask:
    def __init__(self, delay, task):
        self.delay = delay
        self.task = task
        self.stop_event = threading.Event()
        self.task_thread = None

    def signal_handler(self, sig, frame):
        print(f"Signal {sig} received. Stopping...")
        self.stop_event.set()

    def every(self):
        next_time = time.time() - self.delay
        # signal.signal(signal.SIGINT, self.signal_handler)
        try:
            while not self.stop_event.is_set():

                while time.time() < next_time and not self.stop_event.is_set():
                    time.sleep(5)  # Check stop_event every 5 seconds
                if self.stop_event.is_set():
                    break

                try:
                    self.task()
                except Exception:
                    traceback.print_exc()
                    # in production code you might want to have this instead of course:
                    # logger.exception("Problem while executing repetitive task.")
                time.sleep(max(0, next_time - time.time()))

                # Skip tasks if we are behind schedule:
                next_time += (time.time() - next_time) // self.delay * self.delay + self.delay
                # print(next_time)
        finally:
            # signal.signal(signal.SIGINT, signal.SIG_DFL)
            print(f"Loop {self.delay} has been stopped safely.")

    def start(self):
        self.task_thread = threading.Thread(target=self.every)
        self.task_thread.start()

    def stop(self):
        self.stop_event.set()
        if self.task_thread is not None:
            self.task_thread.join()

По какой-то причине внутри докера он не работает должным образом. Просто запускаю на своем компьютере, все работает, но внутри докера - нет.

Я привязывал к вставке меньшее время ожидания, типа 5 секунд, но хоть после запуска он не печатает сразу запрошенные мной данные, и каждые 5 секунд не работает. Ничего не печатает. Только начинает немного работать, когда делаю запрос по ссылке. (это бэкенд на фастапи) он печатает около 5–9 журналов данных, а затем ничего.

У меня работают еще 2 контейнера. 1 с nginx и другой с PostgreSQL.

Что я могу попытаться сделать? Большое спасибо!

🤔 А знаете ли вы, что...
Python - это универсальный язык программирования.


54
1

Ответ:

Решено

Рассмотрите возможность установки переменной среды PYTHONUNBUFFERED=1, установленной в вашей среде Docker Compose, или вызова вашего скрипта с опцией -u, например python -u script.py.

Использованная литература:

  1. https://docs.python.org/3/using/cmdline.html#envvar-PYTHONUNBUFFERED
  2. https://docs.python.org/3/using/cmdline.html#cmdoption-u
  3. https://stackoverflow.com/a/59812588/2635528