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

Initiate a parallel process from within a python script?

我正在构建一个电报机器人,一开始我使用了 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

我现在已经预见到的是,对于一些 messages\requests - 我将有更长的处理时间和其他消息,如果偶数同时出现 - 将等待。对于用户来说,这看起来像是在延迟回答。这归结为一个简单的依赖关系:更多的用户聊天 = 更多的延迟。

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

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

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

我不是 python 方面的专家,想就如何处理这个问题寻求一些想法和指导?谢谢!

你需要的是线程,或者一些可以异步处理很多请求的框架,例如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

简而言之,telepot 为您生成线程,让您从低级细节中解脱出来,让您专注于手头的问题。