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

163 天前
 xinmans
场景:
有一批文件需要处理,每天都有新增的文件。

技术栈:
python+容器

设计:

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

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

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

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

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

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

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

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

你說最後采用了多綫程 + 多路代理解決了需求。這個多路代理的作用是什麽?
xinmans
142 天前
@numoone 避免被封

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

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

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

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

© 2021 V2EX