У меня есть множество потоков которые обращаются к объектам сессии и через него выполняют определенные действия с аккаунтом, так же для этого у меня есть очередь чтобы потоки обращались к сессиям через очередь, чтобы не возникло непредвиденных проблем. При каждом обращение идет переподключение, ибо функции телетона работают только в том потоке, котором был вызван метод 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)