我在Django应用程序中使用了一种长时间轮询,以便随着进程的进行将有关长时间操作的状态消息返回给客户端。为此,我在 View 函数中返回了一个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产生值给iterator的调用者?如果没有,是否有更好的方法?我看了WebSockets,但它似乎还没有完全成熟(特别是在浏览器支持方面)。我还考虑了对服务器的真正轮询,但这将更加复杂,因此我想继续保持开放的连接,并在可能的情况下跨消息流式传输。

最佳答案

尝试:

import itertools

def my_long_operation():
    return itertools.chain(do_something(), do_something_else())

关于python - 在Django中进行长时间轮询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6698355/

10-11 23:09