我正在构建一个电报机器人,并且从一开始我就使用了api包装器示例中的结构。在py脚本中有一个无限循环,它轮询电报api以获取机器人的新消息。并逐个处理每条新消息。
bot.py
我现在已经预见到,有一些消息\请求 - 我会有更长的处理时间和其他消息,如果偶数同时出现 - 将等待。对于用户来说,这似乎是一个延迟回答。归结为一个简单的依赖:更多用户聊天=更多延迟。
我在想:我可以运行这个主脚本answer.py
并检查新消息,每次消息到达时 - 此脚本将启动另一个脚本answer.py
来处理消息并回复。
并且需要并行启动那些bot.py
脚本。
我还可以使用SELECT projectID, name FROM project a
CROSS APPLY (SELECT projectID,periodID FROM project_status WHERE projectID = a.projectID) b
WHERE b.periodID = 3
将所有传入的内容记录到DB中,其中包含有关正在发送消息的用户的参考数据,然后让另一个进程处理所有新记录的数据并将其标记为已应答 - 但是应该处理彼此平行的每个新条目。
我不是python中的大师,并且正在询问有关如何处理此问题的一些想法和指导?谢谢!
答案 0 :(得分:1)
您需要的是线程,或者一些可以异步处理许多请求的框架,例如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,并回答:
Handle multiple questions for Telegram bot in python
简而言之,电信会为您提供线程,让您免于担心低级细节,让您专注于手头的问题。