我很难理解信号如何进入我的应用程序(以及它们如何工作期)。这是我认为适用的三个方面(用我目前的知识):
我完全偏离基地(我觉得我可能会)。 我是否收到信号和多线程混合?如果是这样,他们在应用程序中进行比较吗?它们只是用于解耦吗?另外,确保你提前实例化它们并且不使用本地函数(因为它们会收集垃圾)是什么?有人可以详细说明吗?我是否应该将它们全部放入请求中间件中以便我不必担心?
答案 0 :(得分:16)
Django信号是一种执行操作A
以响应事件E
的方法。
在虚幻的世界中,您可以通过修改发生事件E
的代码来避免使用信号,并附加代码来执行操作A
。
问题在于这样做会导致可维护性,可读性和许多其他软件工程形容词的松散性:)
信号允许您独立地从事件E
发生的位置或方式做同样的事情,并以巧妙的方式这样做,允许可维护性,可读性等......
是的,我认为说Signals对于启用解耦非常有用。
(你也提到了多线程。如果你这样做是因为你认为信号是好的,因为它们是同时执行的那么快......嗯......我不知道它们是否同时被执行但不管怎样我真的不喜欢我认为这是django信号有用的重点。
利用信号的好方法的一个例子是,当你想在django中向用户存储其他信息时,你必须使用Userprofiles。 在这种情况下,documentation itself告诉您注册信号以响应任何新用户的创建,只是为了向新创建的用户添加空用户配置文件。
答案 1 :(得分:4)
这是一个可能有帮助的例子。
假设您需要在保存模型实例时执行某些操作。但是,此操作与模型或模型实例本身无直接关系。因此,将您的操作代码放在模型的save()方法中是没有意义的。这会导致不必要的代码耦合和混乱。相反,您可以在应用程序中的其他位置(甚至在其他应用程序中)创建信号处理程序,使其更有意义。
答案 2 :(得分:1)
我会执行任务2和3(图像内容),例如异步任务队列,如Celery
这与多线程类似。
答案 3 :(得分:0)
这就是为什么它们不如此有用的原因:
最好Celery工作人员可以以真正的异步方式执行长期操作。
这些案例和其中的一些示例,您可以找到in this topic。