Python 使用web2py的异步后台进程

Python 使用web2py的异步后台进程,python,asynchronous,web2py,python-2.x,Python,Asynchronous,Web2py,Python 2.x,我需要在控制器方法内部调用的web2py应用程序中异步处理一个大型(耗时和内存消耗)进程 我的具体用例是通过stdlib.subprocess调用一个进程,并等待它退出而不阻塞web服务器,但我愿意使用其他方法 有实际操作经验者优先 第三方图书馆建议 欢迎光临 不需要/不需要CRON调度 这比人们想象的要困难得多。请注意中的死锁警告。如果你不介意阻塞,这很容易——使用Popen.communication。要解决阻塞问题,可以从线程使用stdlib.subprocess管理进程 我最喜欢的处理

我需要在控制器方法内部调用的web2py应用程序中异步处理一个大型(耗时和内存消耗)进程

我的具体用例是通过
stdlib.subprocess
调用一个进程,并等待它退出而不阻塞web服务器,但我愿意使用其他方法

  • 有实际操作经验者优先
  • 第三方图书馆建议 欢迎光临
  • 不需要/不需要CRON调度

    • 这比人们想象的要困难得多。请注意中的死锁警告。如果你不介意阻塞,这很容易——使用Popen.communication。要解决阻塞问题,可以从线程使用stdlib.subprocess管理进程


      我最喜欢的处理子流程的方法是使用。但是,要想更好地与其他框架配合使用并不容易。

      假设您需要启动多个(可能同时)后台任务实例,解决方案是一个任务队列。我听说过芹菜和RabbitMQ的好处,如果您正在寻找第三方选项,web2py包含的系统可能足以满足您的需求

      无论使用哪种工具,您都将定义一个函数来封装希望后台进程执行的操作。然后使任务队列工作者联机。web2py手册和论坛指出,这可以通过web2py cron系统中的@reboot语句完成,该语句在web服务器启动时触发。如果这不令人满意,可能还有其他方法来启动工人

      在控制器中,您将向任务队列中插入任务,并将任何必要的参数作为输入传递给函数(后台函数不会在与控制器相同的环境中运行,因此它将无法访问会话、数据库等,除非您将适当的值显式传递给任务函数)


      现在,向用户获取后台操作的输出。在将任务插入任务队列时,应该为该任务返回一个唯一的ID。然后,您将实现调用任务队列API以检查指定任务状态的控制器逻辑(可能需要AJAX调用,也可能需要在任务完成之前一直刷新的页面)。如果任务状态为“完成”,则将数据返回给用户。如果没有,请继续等待。

      也许可以查看上的书籍部分。您可以使用新队列或创建自制队列()。还有一个,虽然我不确定它处于什么状态。

      我想内置的任务调度程序正是我想要的。