我有一个网站,有时需要特别长的时间来处理请求(这不是缺陷)。 99%的时间它非常快,因为它几乎不进行任何处理。
我希望在网站需要很长时间处理请求时显示“正在加载”的消息。我的网站使用mod_wsgi和Apache。我看到它的方式,我会在完成处理之前回复说“正在加载”并在之前做两件事之一:
-spawn一个(守护进程)线程来处理。
- 通过套接字与其他进程通信并告诉它处理(最有可能向http://localhost:8080/do_processing发送请求)。
一种方法与另一种方法的利弊是什么?
答案 0 :(得分:0)
过程路线需要相当多的系统处理。创建单独的过程相对昂贵且缓慢。但是,如果您的进程崩溃,它不会影响您的主要管理进程(您将收到退出状态代码,并有机会重新生成新的工作进程)。您还需要某种InterProcessCommunication层(可以是套接字,管道,共享内存等......),如果您的项目,这会增加复杂性。
线程轻巧且便宜。您需要做的就是管理对共享资源的并发访问。所以它真的取决于你的任务。线程可能更有可能是实现任务的适当方式。
答案 1 :(得分:0)
使用单独的流程更好。根据另一个答案的建议,它并不一定很难,因为你可以使用现有的系统来完成它,例如Celery(http://celeryproject.org/)。除非你要实现自己的内部作业排队系统以防止浪费多少线程,否则依赖进程线程并不一定是个好主意。此外,在多进程服务器配置中,您无法保证请求返回到同一进程,因此不容易获取正在运行的操作的状态。最后,Web服务器进程可能会被终止,因此您的后台任务也可能在它完成之前被终止。你需要有一种机制来保持状态,如果这很重要,它可以在这样的事件中存活下来。更容易使用像芹菜这样的东西。