Django中的长轮询
我在我的Django应用中使用了一种长轮询的方法,目的是在长时间运行的操作进行时,将状态消息返回给客户端。我通过在视图函数中返回一个HttpResponse对象来实现,这个对象是用一个可以返回字符串的迭代器初始化的。这一切都运行得很好,但这个迭代器的函数变得相当长,里面有很多的yield语句来返回状态消息。
我想更好地设计这个结构,把长时间的操作拆分成多个函数,每个函数返回自己的状态消息。但是我找不到办法来实现这一点。换句话说,我现在有这样的代码:
def my_long_operation():
do_something()
yield "Did something"
do_something_else()
yield "Did something else"
...我想要的结构是:
def do_something():
do_first_part_of_something()
yield "Did first part of something"
do_second_part_of_something()
yield "Did second party of something"
def do_something_else():
do_first_part_of_something_else()
yield "Did first part of something else"
do_second_part_of_something_else ()
yield "Did second party of something else"
def my_long_operation():
do_something()
do_something_else()
有没有办法让第二个例子中的yield语句将值返回给迭代器的调用者?如果没有,是否有更好的方法?我看过WebSockets,但感觉它还没有完全成熟(特别是在浏览器支持方面)。我也考虑过真正的服务器轮询,但那样会复杂得多,所以我希望如果可能的话,继续保持开放连接并流式传输消息。
1 个回答
4
试试:
import itertools
def my_long_operation():
return itertools.chain(do_something(), do_something_else())