@agent_2203

Из-за чего поток через время зависает при вызове client.start()?

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

Какое-то время скрипт работает, а потом при подключение скрипт просто зависает и поток не отвечает, не заканчивает, ничего не происходит, просто при вызове функции start, он якобы что-то ждет, не продолжая и не выбрасывая никакую ошибку, что это может быть ? Может для этого есть решение ? Или как иначе можно использовать в разных потоках уже запущеную сессию аккаунта ?

Вот часть кода основной функции объекта сессии:

def reconnect(self):
        phone = self.phone
        self.client.disconnect()
        self.client = TelegramClient(
            "temp_sessions/" + phone, api_id, api_hash
        )
        self.client.start(
            phone=self.phone, force_sms=True, 
            code_callback=code_callback
        ) # на этом моменте и все зависает

def execute(self, function, **args): # function == self.function 
        time_before = time()

        # если что-то случилось и образовалась очередь, удобно для отслеживания проблемы
        while self.occupied == True:
            if time_before+10 <= time():
                print(str(function) + " в очереди, ждет " + self.occupied_by)
                time_before = time()
            pass

        # устанавливаем что тот кто обращает - занимает использование
        sem.acquire()
        self.occupied = True
        sem.release()
        print("Вошел " + str(function))
        # устанавливаем исполняющую функцию
        self.occupied_by = str(function)
        
        # исполняем функцию
        while True:
            try:
                sem.acquire()
                print("Выполняем " + str(function))
                try:
                    set_event_loop(new_event_loop())
                except Exception:
                    pass
                self.reconnect() # тут и возникает зависание
                # выполняем функцию которую нужно сделать
                resp_of_function = function(**args)
                print("Выполнили " + str(function))
                sem.release()

                # если есть возвращаемый ответ
                if resp_of_function != None: 
                    sem.acquire()
                    self.occupied = False
                    sem.release()
                    return resp_of_function
                break
            except Exception as e:   
                # если произошла ошибка - обрабатываем ее
                sem.release()
                hadler_response = handler_error(e, self.phone, function)

                if hadler_response == False: # ошибка незначительная, по типу уже состоит в группе
                    break
                elif hadler_response == True: # значит ошибка неизвестна и нужно повторить команду
                    continue
                elif hadler_response == "reload": # значит ошибка сессии и нужно перезапустить ее
                    self.set_new_session()
                sleep(5)     

        # освобождаем объект от той функции которая уже прошла
        sem.acquire()
        self.occupied = False
        sem.release()        
        self.occupied_by = ""
        print("Вышел " + str(function))


Пример использования:

session_obj.execute(session_obj.online)
  • Вопрос задан
  • 38 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
08 мар. 2021, в 10:02
75000 руб./за проект
08 мар. 2021, в 10:00
700 руб./за проект
08 мар. 2021, в 08:37
3000 руб./за проект