我有一个“喜欢”功能,就像社交网络状或竖起大拇指的功能; 用户点击星/心脏/因为喜欢任何标记的内容。 它是用AJAX做,一定要快。 这里唯一的问题是,因为某些原因我必须为每一个“喜欢”做了一些工作,我发现他们直接在“喜欢”视图进行编码,并使其缓慢。 我想使用的信号,使这些任务的执行异步的视图可以发回的JSON马上给JavaScript无需等待完成的任务。 我开始创建了“喜欢”的信号,但后来意识到Django的信号不同步,它最终会一样,认为将不得不等待信号来完成发送回其响应。 所以,我可以尝试使该信号异步的,因为它是在这里和那里解释,但我会以及使用post_save信号为“喜欢”的模式,但现在我不知道如果信号被执行之前的观点可以完成?
Answer 1:
What you want is a thread. They're very easy to use. You just subclass threading.Thread
and write a run
method:
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
Then, when your ready to do the task, you fire it off with:
LikeThread(request.user, something).start()
The rest of your view code or whatever will resume and return the response, and the thread will happily do its work until it's done and then end itself.
See full documentation: http://docs.python.org/library/threading.html
Answer 2:
还应考虑芹菜 (或者更具体的Django芹菜 )。 这是一个异步任务调度器/处理器。 所以,你的post_save信号处理程序创建一个任务,这是拾起并通过芹菜执行。 这样,你仍然有你的快速应用,而繁重进行异步,甚至在不同的机器或批机器。
Answer 3:
嗯,先在Django的所有信号都没有异步的。 为了您的具体情况,我认为post_save
是错误的路要走。 最直接的方法是简单地触发一个AJAX请求查看该做你喜欢的动作,不等待响应。 相反,修改您的视图/ HTML你被炒鱿鱼请求后直接。
这当然需要你事先知道你的用户可以喜欢这个项目,您的要求不会失败。
Answer 4:
该async-signals
包( https://github.com/nyergler/async-signals )抽象这个问题。 你叫一个异步信号的功能; 如果芹菜是存在于包使用它来从一个工人异步发出信号; 如果芹菜是不可用的包发送的传统的同步方式的信号。