在Django中进行长时间轮询
问题内容:
我在Django应用程序中使用了一种长时间轮询,以便在客户端进行过程中向其返回有关长时间操作的状态消息。为此,我在视图函数中返回了HttpResponse对象,该对象已使用返回字符串的迭代器进行了初始化。所有这些都很好用,但是迭代器函数变得相当长,并且产生了大量的收益来返回状态消息。
我想通过将长时间操作拆分为多个函数来更好地进行架构设计,每个函数都返回自己的状态消息。但我看不出有办法做到这一点。换句话说,我有这个:
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()
在第二个示例中,有什么方法可以让yields产生给迭代器调用方的值?如果没有,是否有更好的方法?我看过WebSockets,但它似乎还没有完全成熟(特别是在浏览器支持方面)。我还考虑了对服务器的真正轮询,但这将更加复杂,因此我希望继续保持打开的连接并在可能的情况下跨消息流。
问题答案:
尝试:
import itertools
def my_long_operation():
return itertools.chain(do_something(), do_something_else())