Python 怎么多机器执行任务?求推荐框架

2021-04-08 10:02:44 +08:00
 zealinux

现在 Python 脚本跑任务跑在一台机器上,已经跑了一天了,还没跑完。

  1. 从数据库拿处所有的数据(量非常大)
  2. 循环中每条进行处理(这个处理异步请求 api )
  3. 处理后每条再重新更新到数据库中
  4. db commit

感觉应该有办法并行处理

比如: 生产者一次性创建所有的任务( 1 ), 然后创建 N 个消费者(可以部署到多台机器上), 所有任务入 MQ,然后生产者通过 pull 去拿任务去消费

求推荐的框架或者更好的思路?

4009 次点击
所在节点    Python
31 条回复
fansfans
2021-04-08 10:05:54 +08:00
celery
Vegetable
2021-04-08 10:08:16 +08:00
你这个任务之间互相独立的话,可以直接在取数据时做筛选,然后脚本直接放在不同的机器上跑。
举个例子,在数据库取数据时,A 机器只取 id % 2 == 1 的,B 取 id % 2 ==0 的,这样就实现了两台机器同时处理互不冲突了鸭

不过,你这个任务貌似还不需要多机器,看起来时 io 密集型的,非阻塞编程可能就够了
MegrezZhu
2021-04-08 10:13:03 +08:00
spark / map-reduce?
jiedadada
2021-04-08 10:13:49 +08:00
celery 可以完美解决你的需求,消息队列用 redis 。
zealinux
2021-04-08 10:14:31 +08:00
@Vegetable 感谢,但我的 id 是 uuid,还不大好分片。

但是可以用工具分成 1w 个 id 一个数组,然后存成文件,
再把文件拷贝到另一个机器上,或者再起一个脚本进程然后跑。

但是我这种感觉好麻烦
shoaly
2021-04-08 10:14:45 +08:00
你可以反过来, 不要 消费者去取, 而是生产者去调用 ... 这样就不会冲突了
maocat
2021-04-08 10:16:14 +08:00
一台 redis,N 个 celery
wjidea
2021-04-08 10:24:30 +08:00
我目前做的是 rmq 和 celery 。 请问 rmq 和 redis 性能方面有差别吗?
ch2
2021-04-08 10:27:13 +08:00
为什么不尝试对第二步并行呢?第二步是 IO 密集型还是 CPU 密集型的任务?
hanssx
2021-04-08 10:36:47 +08:00
celery bug 贼多,用着用着就出现各种问题,解决了一个就会出现另一个,比如 https://github.com/celery/celery/issues/4226,不知道现在 5.x 好点了没,而且定时任务需要重启才能修改,有空可以试试 apscheduler + dramatiq
zealinux
2021-04-08 10:40:03 +08:00
@ch2
IO 密集型,我已经做了异步处理,
第二部怎么做并行?

几十万个进程&线程?
这台单机器应该扛不住的
Mars2333
2021-04-08 10:42:58 +08:00
不知道 faust 合不合适
https://github.com/robinhood/faust
ch2
2021-04-08 10:50:59 +08:00
@zealinux #11 IO 密集型单机到达带宽上限也是很可观的,多进程不需要,多线程反正 python 的线程只会吃一个核心,开个 64 线程的池子也无所谓
wuwukai007
2021-04-08 11:05:09 +08:00
celery 跟 redis 搭配,各种问题停不下来,建议跟 rabbitmq 搭配
MintZX
2021-04-08 11:26:56 +08:00
这个数据量大是有多大?一般情况下遇到极大的数据的情况我们都是直接做快照弄个三四天然后再增量把新增数据处理一下。一天弄不完挺正常的?至于 UUID 的问题可以新建一个 indexed column 写个 procedure 搞一个 int ID 出来。。
hanyceZ
2021-04-08 11:29:42 +08:00
celery 纯 beat 用了三个月,bug 不断,各种 bug,flower 卡在 started 状态,定时任务重复执行,还有心跳连接错误导致日志爆了。。。服了
liprais
2021-04-08 11:31:18 +08:00
处理后每条再重新更新到数据库中
积累几万条再一块 load 呗
lithiumii
2021-04-08 12:03:23 +08:00
rq 吧,celery 我反正是用不明白
dayeye2006199
2021-04-08 12:07:36 +08:00
这种一次性,简单并行循环的任务,建议可以考虑[dask]( https://dask.org/)框架。代码非常好写,改动很小,纯 python 框架,不依赖外部服务(数据库、消息队列等)。
建立一个 scheduler 和多台 worker 机器的集群也十分简单。
xchaoinfo
2021-04-08 12:30:22 +08:00
分批次取数据,例如,一次取 10w 条,pandas 处理后,在更新回去。

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

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

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

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

© 2021 V2EX