刚接手了一个公司内部用的项目,用的是 gunicorn+Flask 写的一个 web 服务。 由于执行的有部分业务是分析数据,耗时较长,所以想将该流程拆分,将分析任务拆分成小粒度的流程,自己请求自己,将任务分派给其他 worker 。 但是因为要控制执行分析任务的个数,避免占用太多资源,想用共享变量进行同步,而 gunicorn 框架的多进程是在其框架代码内部 fork 的,不清楚该如何实现进程间同步,请各位指点~ 文件结构 :
|--app |-- init.py |-- module1 |-- module2 |-- gun.conf
app/init.py from flask import Flask app = Flask(name)
使用 gunicorn -c gun.conf app:app 的方式启动 gun.conf 指定 worker_class = 'gevent'
感谢!
1
knightdf 2020-12-22 16:44:04 +08:00
直接丢给 celery 做不行么?
|
2
maocat 2020-12-22 16:59:40 +08:00
rpc ?
|
3
LiebeLee OP @knightdf 之前没接触过,项目里也没有这个,我们想尽量少引入新的模块或者组件依赖,不过也可以去了解一下,多谢!
|
4
LiebeLee OP @maocat 啥意思?这个本身应该也算 rpc,只是分派任务的 worker 需要知道总共有多少个 worker 在做分析任务(包括不是这次分派出去的),要约束总的跑分析任务的 worker 个数,避免阻塞其他业务。
|
5
julyclyde 2020-12-22 19:49:32 +08:00
建议把 web 和实际处理分离开
|
6
iConnect 2020-12-23 00:11:12 +08:00 via Android
单独启动一个应用去处理数据,除非你的数据是和 web 上下文绑定,否则没必要混在一起搞。
|
7
SjwNo1 2020-12-24 09:47:49 +08:00
分析数据实时性邀请高吗,不高的话异步或者交给 crontab
|
9
frankchen 2020-12-24 10:01:50 +08:00
用 celery~
|
10
0bit 2020-12-25 07:05:08 +08:00
推进试试 RQ ( https://python-rq.org/ ),比 Celery 要简单。
这种场景下没必要自己折腾多进程通信什么的,引入一个简单的库,用 task queue,比什么都香。 |
11
0bit 2020-12-25 07:05:27 +08:00 1
推进 -> 推荐
|