请问 Django 在启动的时,如何执行一次性业务代码?

2021-11-10 17:44:11 +08:00
 Phishion

我尝试过各大网站转载的“放在 urls 文件里执行”的办法,但是很不幸,我发现会执行多次。

具体业务就是设计了一个 Redis Set 队列控制并发,任务正常运行的时候是可以加入、弹出的,但是如果任务在运行过程中发生死机,或者其它未知的 Django 整体崩溃,虽然概率很小,但是一旦发生这个队列就会产生脏数据,我现在是考虑启动 Django 的时候,自动清空这个队列,但是就要求这个函数仅运行一次,如果实现不了,我就只能考虑其他办法。

请问有什么其他方法能让我的业务代码在启动的时候就运行一次么?

3375 次点击
所在节点    Django
27 条回复
ericls
2021-11-11 08:08:08 +08:00
ready
littlezzll
2021-11-11 09:10:24 +08:00
celery ?
asmoker
2021-11-11 09:24:49 +08:00
可以参考下 migrate 的逻辑
yufpga
2021-11-11 09:43:42 +08:00
方法挺多的, 简单点在 settings.py 中做, 标准点就是楼上说的 ready, 可以翻一下你自己项目下面的 wsgi.py ,django.setup(), apps.populate(settings.INSTALLED_APPS)的源码. 楼上说多进程启动的问题, 在做这部分操作的时候,用 redis 做个分布式锁就好了
Rebely
2021-11-11 10:51:52 +08:00
写 command, 用 cli 调用
steptodream
2021-11-11 12:47:57 +08:00
直接写在 wsgi.py 文件里就行啊
def xxx():
pass

xxx()
gaogang
2022-05-29 22:03:55 +08:00
@steptodream
这种方式下,如果用的 gunicorn 多进程模式启动 而且没有开启 preload_app 的话 还是会执行多次的

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

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

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

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

© 2021 V2EX