不同的ajax调用轮询周期

让我们假设第一个ajax调用立即生成,控制器调用函数循环直到读取内容,例如:

def FirstAjax(): while True: if something is read: val = something break return val 

在读取内容之前,用户按下“返回”按钮并发送新的ajax请求,例如:

 def SecondAjax(): print "Response from second ajax" 

第二个ajax调用真的被调用(显然,我们正在讨论异步的东西:))但是在完成FirstAjax循环之前不会打印文本。

我希望第二个请求告诉python停止第一个请求的操作,但不知道如何完成!

使用芹菜 。

这是过程:

  1. FirstAjax请求。 Python使用芹菜排队任务。 您可以立即启动任务,也可以在几分钟/小时/天内启动任务。 FirstAjax发回所创建任务的id,而任务本身排队等待在后台执行。 使用芹菜任务ID

  2. 制作SecondAjax ,发送任务ID。 使用该任务ID取消该任务。 如何取消芹菜任务 。

第二个Ajax请求可能会被阻塞,直到第一个完成,因为会话文件可能被锁定。 假设第一个Ajax请求不需要使用会话,您可以让它解锁会话:

 def FirstAjax(): session.forget(response) # unlock the session file [rest of code] 

有关详细信息,请参见此处

问题解决了,这是一个特定的web2py问题。

 def FirstAjax(): session.forget(response) # unlock the session file [rest of code] 

谈论web2py不要锁定会话文件,以便第二个ajax可以立即启动。 另一种方法是设置:

 session.connect(request, response, db) 

在您的模型中,这意味着会话不会保存在文件中,而是保存在DAL“db”中,因此会话不会被锁定。

这两个解决方案与我需要的相同。

在我的情况下,我还需要在按下后退按钮时执行设备释放,只需添加一个要在轮询周期中检查的标志,例如:

 def FirstAjax(): session.forget(response) # unlock the session file HSCAN.SetLeave(False) HSCAN.PollingCycle() #Rest of code def SecondAjax(): HSCAN.SetLeave(True) #Rest of code class myHandScanner(): def __init__(self): self.leave = False def SetLeave(self, leave): self.leave = leave def PollingCycle(self): while True: if self.leave: #Do device release return if something is read: val = something break #Do device release return val 

谢谢大家,希望这有帮助!