1
wnh3yang 2019-04-18 11:50:03 +08:00
用芹菜队列应该可以
|
2
keepeye 2019-04-18 11:55:32 +08:00
创建线程怎么会阻塞主线程呢?能贴下代码么?
我用 tornado 也可以创建线程啊 ``` # 创建队列处理线程 threading.Thread(target=handle_queue, name="handle_queue").start() # 启动 tornado port = os.environ.get('PORT', 8888) api.listen(port) print('listen on {}'.format(port)) tornado.ioloop.IOLoop.current().start() ``` |
3
phithon 2019-04-18 11:56:29 +08:00
创建线程的操作在哪都不会阻塞主线程吧,是不是你 join 了。。
|
4
wizardoz 2019-04-18 12:00:44 +08:00
好多业务通过 celery 就能做到,但是你问的是如何开线程,把创建线程的代码放在 app 的 __init__.py 中即可,并保证 app 会被 import
|
5
neoblackcap 2019-04-18 12:01:22 +08:00
开两个服务,Python 里面就不要用什么线程,当线程死了就好了。
还有就是正常一点都不会搞什么 view 中启动线程做心跳检测,你的检查周期跟请求的生命周期绑定?这个设计我只能投反对票。 还有就是生产环境不会用 manage.py runserver,那个只是给你开发用的。 如果你生产环境用 uwsgi,那么它已经自带心跳检查了,不知道你的心跳想怎么做,一般 http 的它还是能做的,你可以看看 uwsgi 的文档 |
7
myyou 2019-04-18 12:07:22 +08:00
"apscheduler 做不到顺延执行同 job"是什么意思?” misfire_grace_time “参数是你要的吗?
|
8
JamesMackerel 2019-04-18 12:48:24 +08:00 via iPhone
Django crontab
|
9
guyujiezi 2019-04-18 12:53:39 +08:00
首先,你这个解决方案并不恰当,用 supervisor 启动独立守护进程更加合适,不过你的方案要实现也并非不可能。
django 程序一般会被托管给 WSGI 容器来运行,你在 django 程序中无法预料会是以多进程或是多线程运行,你需要一个全局互斥对象( Mutex )来保证这个线程只被运行一次,可以通过文件锁来实现 |
10
kaiccc OP 可能说的比较乱。
我只是想 创建 django 启动时加载一个子线程 |
11
kaiccc OP |
12
est 2019-04-18 14:02:58 +08:00
wsgi 架构里 线程是 anti pattern。建议放弃治疗。
|
13
Qzier 2019-04-18 14:19:13 +08:00
首先你要使用 BackgroundScheduler,然后在你 app 下的 apps.py 中的 AppConfig 子类添加 ready 方法,该方法每次应用载入前被启动一次,然后在 INSTALLED_APPS 注册该类名,而不是 app 名。
|
15
kaiccc OP @myyou 触发器每 5 秒执行,但是任务 实际耗时 10 秒。顺延执行,上个耗时 10 秒任务完成后的 5 秒 触发
|
16
Aprilming 2019-04-18 15:27:40 +08:00
django.channles,可以试试,有延时其中任务这个功能,你可以创建一个 5 秒的延时任务,但时间之后,执行任务 ,执行完毕,在去掉创建延时任务的接口。
|
17
hakono 2019-04-20 20:53:09 +08:00
|
18
gollum9526 2019-06-12 16:51:36 +08:00
django 创建子线程确实会阻塞的,应该是 python 全局锁
|