2

我正在使用 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')

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

感谢您的时间和帮助:)

4

1 回答 1

0

如果两个函数将在同一个进程中调用,那么这是可能的,但 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

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

于 2018-10-18T03:26:05.900 回答