【问题标题】:Thread inside Application vs. Server process应用程序与服务器进程中的线程
【发布时间】:2011-02-18 00:14:22
【问题描述】:

我有一个网站有时需要特别长时间来处理请求(这不是缺陷)。 99% 的时间它非常快,因为它几乎不进行任何处理。

当网站需要很长时间来处理请求时,我想显示一条显示“正在加载”的消息。我的网站使用 mod_wsgi 和 Apache。在我看来,我会在完成处理之前回答说“正在加载”并在此之前做两件事之一:

-产生一个(守护进程)线程来处理处理。

-通过套接字与其他进程通信并告诉它处理处理(很可能向http://localhost:8080/do_processing发送请求)。

一种方法相对于另一种方法的优缺点是什么?

【问题讨论】:

    标签: multithreading fork wsgi


    【解决方案1】:

    使用单独的进程更好。正如另一个答案中所建议的那样,它一点也不难,因为您可以使用现有的系统来完全做到这一点,例如 Celery (http://celeryproject.org/)。除非您要实现自己的内部作业排队系统以防止线程数量过多,否则依赖进程中的线程不一定是一个好主意。此外,在多进程服务器配置中,您不能保证请求返回到同一进程,因此不容易获得正在运行的操作的状态。最后,Web 服务器进程可能会被终止,因此您的后台任务也可能在完成之前被终止。你需要有一种机制来保持状态,如果这很重要,它可以在这样的事件中幸存下来。使用 Celery 之类的东西要容易得多。

    【讨论】:

    • “你不能保证请求会回到同一个进程”这对我来说不是问题。
    【解决方案2】:

    处理路线需要相当多的系统处理。创建单独的进程相对昂贵且缓慢。但是,如果您的流程崩溃,它不会影响您的主要管理流程(您将收到退出状态代码,并有机会重新启动一个新的工作流程)。您还需要某种 InterProcessCommunication 层(可以是套接字、管道、共享内存等),如果您的项目会增加复杂性。

    线程轻巧且便宜。您需要做的就是管理对共享资源的并发访问。所以这真的取决于你心中的任务。线程可能更可能是实现您的任务的适当方式。

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多