При использовании Thread запускается "лишний" поток
Стоит задача создать менеджер сессий в Django/selenium. Для этого необходимо запустить в новом потоке основной цикл класса Manager. Однако при старте сервера цикл в Manager.main запускается два раза, при этом один из них мусорный, не обновляет значения сессий. Как можно подобную проблему решить?
Код менеджера:
# manager.py
class Manager:
def __init__(self, max_workers):
self.sessions_in_line: list[Session] = list()
self.active_sessions: list[Session] = list()
self.max_workers = max_workers
# ...
def main(self):
logging.info("Manager.main loop func was successfully started!")
while True:
logging.info(f"ACTIVE SESSIONS: {self.active_sessions}")
logging.info(f"SESSIONS IN LINE: {self.sessions_in_line}")
with PoolExecutor(max_workers=self.max_workers) as executor:
for session in self.sessions_in_line:
if session.status == "":
executor.submit(session.start)
try:
if session.url in session.driver.current_url:
self.sessions_in_line.remove(session)
self.active_sessions.append(session)
except AttributeError:
pass
with PoolExecutor(max_workers=self.max_workers) as executor:
for session in self.active_sessions:
if session.status == "Регистрация":
executor.submit(session.register)
time.sleep(15)
manager = Manager(max_workers=10)
Способ запуска потока:
# manage.py
# ...
import manager from sessions_management
# ...
if __name__ == '__main__':
class ManagerThread(threading.Thread):
def run(self) -> None:
manager.main()
t = ManagerThread()
t.start()
main()
Логи:
INFO:root:Manager.main loop func was successfully started!
INFO:root:ACTIVE SESSIONS: []
INFO:root:SESSIONS IN LINE: []
INFO:root:Manager.main loop func was successfully started!
INFO:root:ACTIVE SESSIONS: []
INFO:root:SESSIONS IN LINE: []
Функция main вызывает авторелоадер https://github.com/django/django/blob/7119f40c9881666b6f9b5cf7df09ee1d21cc8344/django/core/management/commands/runserver.py#L118 , который просто перезапускает приложение, сам себя ещё раз с флагом https://github.com/django/django/blob/7119f40c9881666b6f9b5cf7df09ee1d21cc8344/django/utils/autoreload.py#L274
Попробуй выключить авторелоад.
Но лучше запускай "менеджер сессий" как admin команду отдельно или вообще без интеграции в django ведь она тут и не используется.