【问题标题】:Django signals - Wait for signal in functionDjango 信号 - 等待函数中的信号
【发布时间】:2012-06-29 03:33:04
【问题描述】:

我正在使用 django,我想从一个函数发送一个信号,并在另一个函数的中间为该信号创建一个“等待点”。

更详细地说, 我正在使用第 3 方 api。所以,

def foo():
   id = thirdPartyFunction(action='/bar')
   id.save()
   # send signal!
   return render_to_response('pleaseWait.html')

def bar():
   # initialize this and that
   # ...
   # WAIT FOR SIGNAL
   return HttpResponseRedirect('success.html')

如何在函数中间创建一个监听器。 目前,我的理解是信号调度程序调用另一个函数。我不知道该怎么做。

感谢您的时间和帮助:)

【问题讨论】:

  • 无法使用 Django 信号。但是,您可以使用 Celery 之类的东西在 foo 中运行任务,然后在 bar 中轮询以确定何时完成。
  • 你给这个问题加了异步标签? Django Signals同步的
  • 对我的第三方应用程序的调用是异步的。
  • 使用 javascript 每 x 秒轮询一次服务器比让视图等待完成更常见。
  • 这正是我最终所做的! :)

标签: django asynchronous signals messaging django-signals


【解决方案1】:

如果这两个函数将在同一个进程中调用,那么这是可能的,但 Django 并不容易做到这一点是有原因的。原因是有更好的方法来做到这一点,例如使用真正的异步工作者。

如果您确实需要这样做,(我经常使用它来测试信号),您可以利用 Django 运行信号的方式(尽管这在未来版本中可能会发生变化。Django 信号都是在一个大循环中运行的在相同的过程中它们被触发,在较早订阅的接收者之后调用后来订阅的接收者。因此,您可以在bar()中执行类似的操作:

def bar():   
    def callback(*args, **kwargs):
        status['triggered'] = True

    signal.connect(callback)

    # wait until signal triggered
    loops = 0
    while loops < 100 and not status['triggered']:
        pass
    if status['triggered']:
        # timeout logic to prevent hangs
    # do whatever you want after the signal triggered

如果您愿意,您甚至可以从回调中的信号中检索数据并将其保存到状态字典中,但不要告诉任何人您从我这里听到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多