8

我很难理解信号是如何在我的应用程序中工作的(以及它们是如何工作的)。这是我认为它们将适用的三个领域(以我目前的知识):

  1. 将 XML 发送到远程服务器以进行报告(事务完成后)。
  2. 用户上传后,重新调整图像大小并将缩略图上传到 S3。
  3. 用户从其帐户中删除图像对象后,从 S3 中删除旧图像。

我完全不在基地吗(我觉得我可能是)。我得到信号和多线程混淆了吗?如果是这样,他们会在应用程序中进行比较吗?它们只是为了脱钩吗?此外,确保您尽早实例化它们并且不使用本地函数(因为它们会被垃圾收集)有什么关系?有人可以详细说明吗?我应该把它们都放在请求中间件中,这样我就不用担心了吗?

4

4 回答 4

17

Django Signals 是一种A响应事件执行操作的方法E

在虚幻世界中,您可以通过修改事件E发生的代码并附加代码来执行操作来避免使用信号A

问题是这样做你会失去可维护性、可读性和许多其他软件工程形容词:)

信号允许您独立地从事件E发生的位置或方式执行相同的操作,并且以一种允许可维护性、可读性等的巧妙方式这样做......

是的,我认为说信号对启用解耦很有用是真的。

(你还提到了多线程。如果你这样做是因为你认为信号很好,因为它们是并发执行的,而且执行得如此之快......嗯......我不知道它们是否同时执行,但无论如何我真的不认为这就是 django 信号有用的地方)

利用信号的一个好方法的一个例子是,当你想在 django 中将其他信息存储给用户时,你必须使用 Userprofiles。在这种情况下,文档本身告诉您,注册一个信号以响应任何新用户的创建可能很方便,只需向新创建的用户添加一个空的用户配置文件。

于 2010-01-19T21:35:26.717 回答
5

这是一个可能有帮助的例子。

假设您需要在保存模型实例时执行一些操作。但是,此操作与模型或模型实例本身没有直接关系。因此,将您的操作代码放在模型的 save() 方法中几乎没有意义。这会导致不必要的代码耦合和混乱。相反,您可以在应用程序中的其他地方(甚至在另一个应用程序中)创建一个信号处理程序,这样更有意义。

于 2010-01-19T21:57:51.503 回答
3

我会用异步任务队列之类的东西来执行任务 2 和 3(图像的东西),比如Celery

这类似于多线程。

于 2011-10-05T23:23:11.760 回答
0

信号不是异步的(不是以并发或并行方式运行)

这就是为什么它们对于您提到的事情不是那么有用:

  • 文件上传或文件后处理
  • 报告生成
  • 任何其他长期操作(对另一台服务器的请求,ET)

可以以真正异步的方式进行长期操作的 Celery工作人员更好。

但它们在一些有限的场景中仍然很有价值

  • 扩展第三方库的功能。如果您使用的应用程序带有您不控制代码的模型,则信号是比猴子补丁更强大的替代方案,用于在保存或删除时执行特定操作。
  • 删除信号适用于删除查询集方法。如果您希望在单个对象和查询集删除上都发生相同的操作,那么信号可能是您最好的选择。
    注意:由于生成 SQL 的方式,这不适用于更新查询集方法(带有保存信号)。另一个常见的混乱/错误来源。
  • 当您需要将相同的信号处理程序应用于多个模型时。如果您只有几个,我仍然倾向于覆盖保存/删除方法并调用共享函数。对于很多人来说,到处复制/粘贴保存方法变得更容易出错,并且信号看起来是一个更好的选择。
  • 避免紧密的跨应用程序依赖。如果您需要跨越应用程序边界,特别是当应用程序可能在多个项目中使用时,信号可能更适合应用程序之间的松散耦合。不过要小心这个。使用它是因为你需要,而不是因为你认为你将来可能需要它。

您可以在本主题中找到这些案例和一些示例。

于 2019-09-24T09:57:51.360 回答