Задать вопрос
yxtiblin
@yxtiblin

Как асинхронно запустить методы класса?

Пишу код на telethon, объявил класс так как работать нужно будет с несколькими аккаунтами сразу и запустить его по старинке с помощью gathcher у меня не получилось, поэтому я сделал все функции обычными(без async) и запустил через потоки, что оказалось не тем что мне нужно. Как можно запустить их асинхронно?
from copyreg import pickle
from telethon import TelegramClient
import logging, eel
import telethon
from telethon.tl.functions.channels import JoinChannelRequest
from telethon.tl.functions.messages import ImportChatInviteRequest
from threading import Thread
import asyncio
logging.basicConfig(format='[%(levelname) 5s/%(asctime)s] %(name)s: %(message)s', level=logging.WARNING)

class Client:
    def __init__(self, acc):
        self.name = acc['name']
        self.api = acc['api']
        self.hash = acc['hash']

    async def client(self):

        print(f"{self.name} ----------------------------------------------")
        try:
            self.client = TelegramClient(self.name, self.api, self.hash)
            clientFind = True
        except Exception as err:
            print(f"{self.name} не найден\n{err}")
            clientFind = False

        if clientFind:
            try:
                try:
                    await self.client(ImportChatInviteRequest(Link))
                except telethon.errors.rpcerrorlist.InviteHashExpiredError:
                    await self.client(JoinChannelRequest(Link))
            except Exception as err:
                print(f"Не удалось войти в чат\n{err}")

            while True:
                print(f"{self.name} ----------------------------------------------")
                await asyncio.sleep(1)



async def main():
    accounts = [{'name': 'client1', 'api': 'api1', 'hash': 'hash1'},
                {'name': 'client2', 'api': 'api2', 'hash': 'hash2'}]

    clients = [Client(acc) for acc in accounts]
    for client in clients:
        await asyncio.gather( 
            client.client() # тут вызывается каждый из экземпляров класса
        )
        #client = Thread(target=client.client).start()

# код ниже к вопросу не принадлежит
@eel.expose
def start(links):
    global Link
    Link = links.split(',')
    asyncio.run(main())

eel.init("web")
eel.start("main.html", host='127.0.0.2', port=0, size=(280,250))
  • Вопрос задан
  • 211 просмотров
Подписаться 3 Простой 7 комментариев
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы