从python脚本中启动并行进程?

时间:2015-11-11 16:32:36

标签: python parallel-processing telegram-bot

我正在构建一个电报机器人,并且从一开始我就使用了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中的大师,并且正在询问有关如何处理此问题的一些想法和指导?谢谢!

1 个答案:

答案 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

简而言之,电信会为您提供线程,让您免于担心低级细节,让您专注于手头的问题。