V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
xinmans
V2EX  ›  Python

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

  •  
  •   xinmans · 2023-11-30 23:56:31 +08:00 via iPhone · 1330 次点击
    这是一个创建于 384 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景:
    有一批文件需要处理,每天都有新增的文件。

    技术栈:
    python+容器

    设计:

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

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

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

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

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

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

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

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

    你說最後采用了多綫程 + 多路代理解決了需求。這個多路代理的作用是什麽?
    xinmans
        14
    xinmans  
    OP
       363 天前 via iPhone
    @numoone 避免被封
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1051 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:52 · PVG 06:52 · LAX 14:52 · JFK 17:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.