1

我正在构建一个电报机器人,一开始我使用了 api 包装器示例中的结构。在 py 脚本中有一个无限循环,它轮询电报 api 以获取机器人的新消息。并一一处理每一条新消息。

 while True:
    for update in bot.getUpdates(offset=LAST_UPDATE_ID, timeout=10):
        chat_id = update.message.chat.id
        update_id = update.update_id
        if update.message.text:
            #do things with the message \ start other functions and so on

我现在已经预见到的是,对于某些消息\请求-我将有更长的处理时间,而其他消息,即使同时出现-也会等待。对于用户来说,这看起来像是响应延迟。这归结为一个简单的依赖关系:更多的用户聊天 = 更多的延迟。

我在想:我可以让这个主脚本bot.py运行并检查是否有新消息,并且每次有消息到达 - 这个脚本将启动另一个脚本answer.py来处理消息并回复。

并根据需要并行启动这些answer.py脚本。

我还可以使用bot.py有关发送消息的用户的参考数据将所有传入的东西记录到数据库中,然后让另一个进程处理所有新记录的数据并将其标记为已回答 - 但它应该同时处理每个新条目其他。

我不是 python 的专家,并且正在寻求一些关于如何解决这个问题的想法和指导?谢谢!

4

1 回答 1

2

你需要的是线程,或者一些可以异步处理许多请求的框架,例如 Python 3.4 中的 Twisted、Tornado 或 asyncio。

这是使用线程的实现:

import threading

def handle(message):
    ##### do your response here

offset = None

while True:
    for update in bot.getUpdates(offset=offset, timeout=10):
        if update.message.text:
            t = threading.Thread(target=handle, args=(update.message,))
            t.start()

        offset = update.update_id + 1

        ##### log the message if you want

这样,调用handle()不会阻塞,循环可以继续处理下一条消息。

对于更复杂的情况,例如,如果您必须维护来自相同消息的状态chat_id,我建议看一下telepot,这个答案:

在 python 中处理 Telegram 机器人的多个问题

简而言之,telepot 为您生成线程,让您不必担心底层细节,让您专注于手头的问题。

于 2015-11-12T01:03:35.543 回答