【问题标题】:python decorators in asyncio event listener with Telethon带有 Telethon 的异步事件侦听器中的 python 装饰器
【发布时间】:2022-09-27 22:48:25
【问题描述】:

每次将消息发送到通道时,都会调用处理函数,因为 python 装饰器。 我想同时接收消息并将它们打印出来。这就是我想象的程序应该是什么样子。

但它不起作用,因为事件没有传递给 main 中的处理函数。 当@client 装饰器控制消息并阻止我在其他函数中使用处理函数并传递 tokenData 时,我该如何异步执行此操作

from telethon import TelegramClient, events

client = TelegramClient(username, api_id, api_hash)
client.start()
channel = \'https://t.me/DEXTNewPairsBotBSC\'


@client.on(events.NewMessage(chats=channel))
async def handler(event):
    # tokenData = event
    tokenData = event.message.message
    msg.append(tokenData)
    await asyncio.sleep(2)
    return tokenData


async def dumpIt():
    await asyncio.sleep(2)
    return msg[0]

async def main():
    task1 = asyncio.create_task(handler(event))
    task2 = asyncio.create_task(dumpIt())
    await asyncio.wait([task1,task2])


client.loop.run_until_complete(main())


  • 最好直接在handler() 中运行dumpIt(tokenData) - 这是在处理程序收到新消息时运行dumpIt 的唯一方法

标签: python asynchronous async-await python-asyncio telethon


【解决方案1】:

使用asyncio.Queue

import asyncio
from telethon import TelegramClient, events

client = ...
queue = asyncio.Queue()

@client.on(events.NewMessage(chats=channel))
async def handler(event):
    queue.put_nowait(event.message.message)


async def dumpIt():
    msg = await queue.get()
    return msg

async def main():
    await dumpIt()

client.loop.run_until_complete(main())

只要asyncio 事件循环正在运行(它在queue.get() 中被“阻止”),Telethon 就会收到更新。

【讨论】:

    猜你喜欢
    • 2018-05-26
    • 2017-03-16
    • 1970-01-01
    • 2012-12-05
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    相关资源
    最近更新 更多