51

我有一个like类似于社交网络的功能或点赞功能;用户点击星/心/任何东西来标记内容为喜欢。它是用ajax完成的,必须很快。

这里唯一的问题是,由于某些原因,我必须为每个任务执行一些任务like,我发现它们是直接在like视图中编码的,这使得它变慢了。

我正在考虑使用信号使这些任务的执行异步执行,以便视图可以立即发送回,jsonjavascript无需等待任务完成。

我开始为 django 创建一个信号,like但后来意识到 Djangosignals不是异步的,它最终会是一样的,视图必须等待信号完成才能发回它的响应。

因此,我可以尝试按照signal此处和此处的说明进行异步操作,但我也将post_save信号用于like模型,但现在我想知道视图是否可以在信号执行之前完成?

4

4 回答 4

53

还要研究celery(或更具体地说django-celery)。它是一个异步任务调度程序/处理程序。因此,您的 post_save 信号处理程序创建了一个任务,该任务通过 celery 拾取并执行。这样,您仍然拥有快速的应用程序,而繁重的工作是异步执行的,即使在不同的机器或一批机器上也是如此。

于 2012-08-11T13:57:11.260 回答
30

你想要的是一个线程。它们非常易于使用。您只需子类化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

然后,当您准备好执行任务时,您可以使用以下命令启动它:

LikeThread(request.user, something).start()

您的视图代码的其余部分或任何将恢复并返回响应的内容,线程将愉快地完成其工作,直到完成然后自行结束。

查看完整文档:http ://docs.python.org/library/threading.html

于 2012-08-10T14:53:38.843 回答
8

嗯,首先 Django 中的信号不是异步的。对于您的特定情况,我认为这post_save是错误的方法。最直接的方法是简单地触发一个 ajax 请求来查看您喜欢的操作,而不是等待响应。而是在您触发请求后直接修改您的视图/html。

这当然需要您事先知道您的用户可以喜欢这个项目并且您的请求不会失败。

于 2012-08-10T09:59:32.870 回答
3

async-signals( https://github.com/nyergler/async-signals ) 抽象了这个问题。您调用异步信号函数;如果 Celery 存在,则包使用它从工作人员异步发出信号;如果 Celery 不可用,则包以传统的同步方式发送信号。

于 2014-05-13T22:13:50.027 回答