Python阻塞与非阻塞OS调用

时间:2014-11-07 09:11:43

标签: python subprocess popen

在编写Web应用程序时,我很难阻止操作系统调用和大量JSON响应,这会在以后引入应用程序的延迟。我想做的是拨打“Popen"打开子进程。现在我们知道“Popen"不会阻止正常执行,因此无论何时我需要进行OS调用我都会推迟,而是在应用程序启动时更早地进行调用并将结果存储在变量中。现在,当我需要结果时,我检查变量是否为空并从中获取响应。

这样我的应用程序可能不会阻止繁重的OS调用。

我需要知道是否有更好的其他python库/方法,如果我遵循这种方法,我如何有效地处理僵尸进程。

1 个答案:

答案 0 :(得分:0)

当然,如果您在应用程序的生命周期内运行一次重度查询,那么在启动时运行它们并缓存结果。在开始提供请求之前执行此操作,它永远不会影响您的用户。检查用户请求资源以查看缓存中是否存在值的时间是“懒惰”'或者延迟'缓存,这仍然会影响用户。即使使用Popen,您仍然需要一种方法来推迟响应客户端并屈服于其他线程。

听起来您正在编写基于BaseHTTPServer或类似的原始HTTP服务器?如果是这样,你想看看WSGI并选择WSGI compliant servers之一,如Gunicorn。将它与诸如Flask之类的WSGI framework相结合,您将解决缩放问题,而无需诉诸Popen并重新发明轮子。

Gunicorn处理多线程客户端连接,Flask处理您的请求状态。您可能仍需要做一些工作来处理长时间运行的请求,但这个过程会更容易。

通常,您希望将响应时间缩短,以免不必担心超时等。为此,如果您有一个由用户启动的长时间运行流程,您可能希望将流程拆分为三个步骤。

  1. start_task 用户启动请求,并将其提交给任务队列(请查看Celery或Python RQ),并返回跟踪ID。
  2. check_task 用户提供跟踪ID,API会返回状态。
  3. get_result 任务完成后,用户将检索结果。
  4. 在您的网络应用程序用户界面中,您可以在每个阶段向用户提供反馈,并可能通过“check_task”提供进度指示器。调用