一个多并发处理文件的程序该如何设计才优雅

2023-11-30 23:56:31 +08:00
 xinmans
场景:
有一批文件需要处理,每天都有新增的文件。

技术栈:
python+容器

设计:

方案一
主程序 python 处理文件
为了提高并发和隔离性,希望起多个容器来实现并发处理,加上 redis 做分布式锁避免重复处理
处理完的文件会改后缀为.b ,待处理文件是后缀.a

可以分发到多台机器上并发处理

方案二
选择 python 多线程或者多进程来加大并发,可能更加简单,需要单机处理能力较强

方案一上遇到一些问题,比如容器的日志文件处理
docker-compose 的 deploy replica 好像无法处理成多个日志,造成打日志混乱
程序会 hang 住,日志不刷新
如何处理
1338 次点击
所在节点    Python
14 条回复
lianyue
2023-12-01 00:04:47 +08:00
1. 每个文件处理时间
2. 每次处理 对 cpu 占用
3. 每天新增文件有多少
4. 文件是否是本地文件

才能得到具体方案
xinmans
2023-12-01 10:30:56 +08:00
@lianyue 1 每个文件处理时间大概 10 都 60 分钟不等,看文件大小
2 ,对 cpu 占用有一定的开销,是 cpu 计算型应用
3 ,每天新增 10-50 个文件
4 ,是本地文件,在一个目录下
iorilu
2023-12-01 10:39:30 +08:00
这种事情和 python 多并发没啥关系把

可能弄个 shell 脚本控制复制的文件到目标机器就行

比如有两台机器, 都运行同样程序, 无所谓什么多并发, 用最简单的单线程处理, 都定时扫描某个目录看是否有新文件

有个 shell 脚本或类似程序复杂将文件分开复制到那两台机器的目录不就行了
F7TsdQL45E0jmoiG
2023-12-01 11:23:20 +08:00
不适合用容器
jones2000
2023-12-01 12:22:14 +08:00
如果是 IO 瓶颈,开 docker 没什么用, 还是读同一个机器上的盘。IO 瓶颈你就加物理机, 每个物理机开处理程序。 新增的文件分发到不同的物理机上。 这样才能提高 IO 。
realJamespond
2023-12-01 14:23:14 +08:00
单线程监测目录文件变化,再放到多线程队列消费
lianyue
2023-12-01 16:51:13 +08:00
@xinmans 这么小 多线程就好了 60*50 /1440 = 2.08 天 1 个线程干完
3-4 个线程就好了 没到分机器的地步
按照
6 楼方案 就行了
xinmans
2023-12-01 18:12:56 +08:00
谢谢各位,我用单线程和多线程来试试。
julyclyde
2023-12-04 13:27:29 +08:00
既然要处理文件,为啥用容器呢?
xinmans
2023-12-04 14:13:42 +08:00
@julyclyde 容器部署维护简单。最终通过多线程+多路代理搞定了并发处理的需求。
julyclyde
2023-12-04 15:38:15 +08:00
@xinmans 用容器的话,你的文件是通过 volume 挂进去吗
xinmans
2023-12-05 10:22:06 +08:00
@julyclyde 对的
numoone
2023-12-21 16:38:52 +08:00
@xinmans 你說的用容器是指將 python 脚本以容器的方式部署在不同的物理機上,而不是在一臺物理機上啓用多個容器吧?

你說最後采用了多綫程 + 多路代理解決了需求。這個多路代理的作用是什麽?
xinmans
2023-12-21 18:33:15 +08:00
@numoone 避免被封

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

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

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

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

© 2021 V2EX