Django 中 Signal 的意义是什么

2021-03-10 11:17:48 +08:00
 IurNusRay
试了一下 Django 自带的 Signal 模块,也并不能异步啊,而且又是在框架内发送 /接收消息,那么它存在的意义就单纯是为了代码解耦吗?如果这样干嘛不直接写个普通函数呢..
2239 次点击
所在节点    Python
14 条回复
twotiger
2021-03-10 11:50:18 +08:00
是的就是解耦。
我个人也很少用到这个,不过之前的公司用来删除数据时,做一些操作。
这种东西也就是一种设计模式,用好了,写的很好看,用的不好,还不如不写。
xiaolinjia
2021-03-10 11:52:19 +08:00
确实就是解耦,而之所以不写个普通函数,大概是因为传参很麻烦。
GTim
2021-03-10 11:54:50 +08:00
普通函数会涉及到声明的地方和调用的地方,这两者可能会高度耦合的。这边 import 一下 那边 import 一下。

信号就不一样了,信号不用管谁接收,发出去即可。接收的地方也不用管谁发的,收到消息处理即可
IurNusRay
2021-03-10 12:53:55 +08:00
@GTim 可是似乎用能信号来实现的功能,用普通函数来实现也可以啊,信号好像没没什么优势。比如我在收到客户端的点赞、评论、回复等请求的时候,要向指定用户发送消息提醒,那么我完全可以写一个公共函数,接收用户 id 、消息内容,然后发送消息,这个函数也可以在全局所有地方导入、调用,并没有什么缺点啊。。
GeruzoniAnsasu
2021-03-10 12:57:41 +08:00
想象一下 UI 编程。
把 click 看成一个 signal,http 模块把现在文本框的内容 post 出去作为 slot

显然在 button 的 onclick handler 里完全没必要实例化一个 http requester,从某个全局区获取一个 requester 再进行请求则更显怪异。优雅的做法当然是让 click 只作为一个信号灯,我们找一个第三者视角,看到灯亮的时候指使 http 模块发出请求。在第三者的上帝视角里能看到 button 的实例与 http 模块的实例,而 button 和 http 相互并不需要知道对方的实例存在。

这是 qt 框架最基本的事件响应机制。基本上有 signal 这个概念的框架设计理念都是类似的。
IurNusRay
2021-03-10 13:10:16 +08:00
@GeruzoniAnsasu 好像有点明白了,谢谢
est
2021-03-10 13:16:37 +08:00
> 如果这样干嘛不直接写个普通函数呢..

因为你手上的业务不够多。。

等你一个函数内部同时服务 3 、5 个需求方的时候,就知道麻烦了。
coolair
2021-03-10 13:30:07 +08:00
这个是我很喜欢 Django 的一点……太好用了,太方便了。
2owe
2021-03-10 15:04:57 +08:00
Signal,就是一种“注册-发布-订阅”的功能实现。

Django 框架对外提供了一些信号,比如 post_save

Ps. 想要异步的话,可以自己加 celery 改造
23333333333
2021-03-10 16:07:55 +08:00
其实最大的作用就是解耦

举个例:子 更新 cache

* 有个函数去接 post_save 的信号,接到这个信号之后去删除对应的 cache,而不是每次手动去操作
hj24
2021-03-10 16:14:59 +08:00
确实只能解耦,你把代码写到一个函数里也是一样的,之前用 go 重构这种代码的时候基本都是写回到一个函数里
acmore
2021-03-10 16:25:00 +08:00
类似于(或者就是) Mediator pattern
小项目用这个没有啥显著收益,直接普通函数完全没问题。
大项目的好处楼上已经说得很全面了。

但它会造成调用方和服务提供方在语法上的隔离,不是完美也不是唯一的方案。
zachlhb
2021-03-10 18:14:24 +08:00
逻辑解耦,比如完成一个操作后需要执行其他操作,而这些操作可能现在不确定或不是由你开发的,这时就需要用到信号,一个信号可以有多个接收者,这个很好管理,如果需要异步,可以在信号接收逻辑里派发异步任务
zepc007
2021-03-31 17:49:07 +08:00
实际用处并不大,又不是异步,只不过是对数据处理提供一种 hook 方式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/760254

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX