让我们假设第一个ajax调用立即生成,控制器调用函数循环直到读取内容,例如:
def FirstAjax():
while True:
if something is read:
val = something
break
return val
在阅读某些内容之前,用户按下“返回”按钮并发送新的ajax请求,例如:
def SecondAjax():
print "Response from second ajax"
真正调用了第二个ajax调用(显然,我们正在讨论async stuff :))但是在FirstAjax循环完成之前不会打印文本。
我希望第二个请求告诉python停止第一个请求的操作,但不知道如何完成!
答案 0 :(得分:0)
使用Celery。
这是过程:
提出FirstAjax
请求。 Python使用芹菜排队任务。您可以立即启动任务,也可以在几分钟/小时/天内启动任务。 FirstAjax发回所创建任务的id,而任务本身排队等待在后台执行。 Using celery task ids
发送SecondAjax
,发送任务ID。使用该任务ID取消该任务。 How to cancel a celery task
答案 1 :(得分:0)
第二个Ajax请求可能会被阻塞,直到第一个完成,因为会话文件可能被锁定。假设第一个Ajax请求不需要使用会话,您可以让它解锁会话:
def FirstAjax():
session.forget(response) # unlock the session file
[rest of code]
有关详细信息,请参阅here。
答案 2 :(得分:0)
问题已解决,这是一个特定的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
谢谢大家,希望这会有所帮助!