如何在绑定到Telethon的异步函数中进行循环?

时间:2019-08-22 08:56:32

标签: python-3.x for-loop telethon python-asyncio

我想通过绑定到NewMessage事件的异步def函数中的模式'get_data'访问Telethon中的对话框和消息。总体而言,绑定有效,并且我在STDOUT中得到“ hi”响应,但是对于循环,我没有得到“ hi2”响应,因此以后的代码不执行。我不确定我是否了解异步理论,但我们会看到的。

我尝试了一些异步功能(例如睡眠,等待),将我的client.start()从事件绑定之前移到了事件之后,使用外部for-in循环执行功能,并在async def内部使用await调用它,但没有任何效果。 / p>

client = TelegramClient('session', api_id, api_hash)
client.start()

print('1')
@client.on(events.NewMessage(pattern='get_data'))
async def get_data(event):
    await print('hi')
    print(client.iter_dialogs())
    for dialog in client.iter_dialogs():
        print('hi2')
        print(dialog.name)

        for message in client.iter_messages(dialog.id, reverse=True):
            entity = client.get_entity(message.sender_id)
            print('{0} {1}'.format(entity.first_name, entity.last_name), ':', message.text)
    await event.respond('Got data!')

client.run_until_disconnected()

我希望在不弄乱的情况下执行for-in循环,因为我想进一步扩展此代码。我希望它们以/ correct /的方式执行-因此,当我调用get_data时,将使它们像普通程序一样执行,而无需在内部进行异步处理(因此,这就是为什么我要等待的原因)。

也许我的尝试很好,但是我没有正确使用Telethon?

1 个答案:

答案 0 :(得分:0)

for ... iter_messages替换为async for ... iter_messages,并用iter_dialogs替换。目前,您没有运行异步代码。编辑:不要等待print()