我有一个'喜欢'的功能,就像社交网络或赞成功能; 用户点击星标/心脏/任何内容以标记所喜欢的内容.它是用ajax完成的,必须很快.这里唯一的问题是,由于某些原因,我必须为每个'喜欢'做一些任务,我发现它们是在'喜欢'视图中直接编码而且它使它变慢.我正在考虑使用信号来使这些任务的执行异步,因此视图可以立即将json发送回javascript,而无需等待任务完成.我开始为'喜欢'创建一个信号但后来发现Django的信号不是异步的,它最终会一样,视图必须等待信号完成才能发回它的响应.所以我可以尝试使该信号异步,因为它在这里和那里解释但我也会使用post_save信号为'like'模型,但现在我想知道视图是否可以在信号执行之前完成?
Bou*_*uke 39
还要研究芹菜(或更具体地说是django-celery).它是一个异步任务调度程序/处理程序.所以你的post_save信号处理程序创建一个任务,通过芹菜获取并执行.这样,即使在不同的机器或一批机器上,您仍然可以快速应用,同时执行繁重的异步操作.
Chr*_*att 26
你想要的是一个线程.它们非常容易使用.你只是子类threading.Thread
并编写一个run
方法:
import threading
class LikeThread(threading.Thread):
def __init__(self, user, liked, **kwargs):
self.user = user
self.liked = liked
super(LikeThread, self).__init__(**kwargs)
def run(self):
# long running code here
Run Code Online (Sandbox Code Playgroud)
然后,当你准备好完成任务时,你用以下方法解雇它:
LikeThread(request.user, something).start()
Run Code Online (Sandbox Code Playgroud)
其余的视图代码或其他任何内容将恢复并返回响应,线程将很乐意完成其工作,直到完成然后结束.
请参阅完整文档:http://docs.python.org/library/threading.html
嗯,首先Django中的信号不是异步的.对于你的特殊情况,我认为post_save
是错误的方法.最简单的方法就是触发一个ajax请求来查看你喜欢哪个动作并且不等待响应.而是在您触发请求后直接修改您的view/html.
这当然要求您事先知道您的用户可能喜欢这个项目,并且您的请求不会失败.