Как запустить поток вместе с клиентом Telethon - PullRequest
0 голосов
/ 04 апреля 2020

Я готов отправлять некоторые сообщения, используя telethon в зависимости от времени, мой подход состоял в том, чтобы написать функцию и запустить ее в новом потоке и проверять, какие сообщения я должен отправлять каждую секунду. то есть что-то вроде ниже:

async def function():
  while True:
    time = datetime.datetime.now()
    await send_some_messages(time)

но телетону нужно, чтобы я ждал на том же l oop, что и во время работы. Я знаю, что могу получить текущий l oop с помощью client.run_until_disconnected(), но я запутался, как мне это сделать.

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

1 Ответ

1 голос
/ 04 апреля 2020

Вам не нужно использовать потоки, когда вы работаете с asyncio, и вам также не нужно использовать client.run_until_disconnected(). Все, что нужно, это поддерживать событие l oop работающим, пока клиент не будет отключен. Пока вы запускаете событие l oop, Telethon будет работать нормально.

# Create client
client = ...

# Do whatever with the client
@client.on(...)
async def handler(event):
    ...

async def main():
    while True:
        # Do whatever (check if now is time to send messages, for example)
        ...

        # Yielding control back to the event loop here (with `await`) is key.
        # We're giving an entire second to it to do anything it needs like
        # handling updates, performing I/O, etc.
        await asyncio.sleep(1)

client.loop.run_until_complete(main())

Другие способы сохранить событие l oop в рабочем состоянии - использовать loop.run_forever, и не забывайте, что вы можете asyncio.create_task или подождать многих из них ... Я рекомендую вам прочитать asyncio документы. Как и threading, документацию стоит изучить, чтобы узнать, как ее использовать.


В качестве примечания, если вам действительно нужны потоки (например, вы ' Вы выполняете интенсивную работу с ЦП), asyncio также прикрывает спину. Но на самом деле ничего из этого не определено c для Telethon.

Если вы хотите лучше понять, как работает asyncio (возможно, это поможет вам), см. Введение в Asyncio

Само собой разумеется, есть лучшие способы проверить, когда пришло время отправлять сообщения (используя кучу и события, спать до следующего времени или другого максимума, а не только одну секунду), но это должно получить Вы начали.

...