【问题标题】:Initiate a parallel process from within a python script?从 python 脚本中启动并行进程?
【发布时间】:2016-02-20 09:28:13
【问题描述】:

我正在构建一个电报机器人,一开始我使用了 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 方面的专家,我想就如何解决这个问题寻求一些想法和指导?谢谢!

【问题讨论】:

    标签: python parallel-processing telegram-bot


    【解决方案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

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

    【讨论】:

    • 谢谢!您的图书馆似乎是一个很棒的工具!我即将创建另一个机器人,为此我将使用您的库!我已经拥有的那个 - 我将不得不稍微重组代码以使用传送,但我已经阅读了您的项目并发现它非常有用!:) 谢谢!关于线程 - 我确实尝试在我的主机器人中执行线程,但事情一直在崩溃......不知道出了什么问题......我将切换到传送:)
    • 你必须非常小心地使用线程;当两个线程尝试更改相同的数据时,事情可能会变得不稳定,并且这些类型的错误可能很难追踪(因为它们可能不会一直发生)。如果你真的需要同时处理很多请求,我推荐使用异步的方式。异步编程与经典编程略有不同,但值得努力。
    • 谢谢!我对 Python 和这类任务还很陌生,所以我必须阅读更多内容,但你在这里给了我一个很好的开始!:) 谢谢!
    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多