求解惑, Python 多进程问题 - V2EX
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
alexlip
V2EX    Python

求解惑, Python 多进程问题

  •  
  •   alexlip 2020-01-09 21:09:27 +08:00 3388 次点击
    这是一个创建于 2104 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求:多进程使用 mysqldump 分表逻辑备份 mysql.

    开始使用 gnu parallel 来进行多进程备份,发现如果有一个进程备份时间久的话,会卡住已完成的进程等待这个进程. 不太了解 prarllel,所以考虑用 python multiprocessing.pool 来管理进程,目的是尽快的分配任务让多核来完成任务. if name == 'main': result = list() with open(sys.argv[1],'r') as o: lines = csv.reader(o) for line in lines: result.append(line) p = Pool(5) for i in result: p.apply_async(run,(i,)) p.close() p.join()

    使用以上方式直接创建 pool,在 run 里使用 os.system 调用 mysqldump 执行备份工作.测试发现, 1234 进程已经完成备份,5 还未完成. 在这种情况下,1234 进程在等待 5 的完成, 并不是理想中的继续接任务执行.

    求解惑,这是什么情况? 如何能实现我的需求. 如果用 queue 在 run 函数中读取队列,能否实现?

    16 条回复    2020-01-13 09:58:00 +08:00
    ipwx
        1
    ipwx  
       2020-01-09 21:12:15 +08:00
    如果你只有五个任务,那么 1234 跑完等第 5 个不是很合适么。。。

    你这需求都没有描述清楚,而且排版乱七八糟。
    alexlip
        2
    alexlip  
    OP
       2020-01-09 21:19:21 +08:00
    @ipwx 不好意思. 发的时候是正常的[哭] ...
    实际任务有 100 多, 开了 10 个进程.
    所以我想问的是, 一批次执行 10 个任务的情况下, 是要等待 10 个任务完成,才会进行后续的任务吗?
    wuwukai007
        3
    wuwukai007  
       2020-01-09 21:19:54 +08:00 via Android
    os.system 是阻塞的,就算开进程池也没用,5 个进程也在等待,用线程把 os.system 包起来
    alexlip
        4
    alexlip  
    OP
       2020-01-09 21:22:24 +08:00
    @wuwukai007 我理解 os.system 是阻塞的, 我的想法是等 os.system("mysqldump") 执行完毕,再继续执行任务.
    我的问题是 5 个 os.system 4 个已经完成, 并没有继续接受新的任务执行.而是在等待第 5 个执行结束
    ipwx
        5
    ipwx  
       2020-01-09 21:31:08 +08:00 via Android
    你这就是你的全部代码么? 如果不是,请原样发上来。另外其实 thread 就能搞定不需要 process,毕竟你是调用了 os.system
    alexlip
        6
    alexlip  
    OP
       2020-01-09 21:35:12 +08:00
    不知道怎么编辑追加帖子. 只能再回复里写了.

    100 个需要执行的任务, 开 10 进程. 使用 Pool, 期望实现哪个进程空闲哪个进程执行任务.因为表有大小,执行时长不同.现在的情况是 123456789 执行完毕, 10 还在执行. 123456789 并没有继续接任务执行,而是在等待 10 的完成. 在 10 完成后才会接后面的 10 个任务同时开始执行. 我怎么才能实现 123456789 不等待 10, 直接继续后续任务?
    ipwx
        7
    ipwx  
       2020-01-09 21:38:05 +08:00 via Android
    @alexlip 我说的是你的代码!代码!鬼知道你怎么写的代码出了你说的问题,我现在只能回答你,用 pool 可以不阻塞在第十个任务上
    alexlip
        8
    alexlip  
    OP
       2020-01-09 21:38:06 +08:00
    ```def run(dbtab):
    folder='/home/www/dbbak/'+time.strftime("%Y%m%d",time.localtime())
    cmd = "/home/www/mysql-5.7.12/bin/mysqlpump --host 127.0.0.1 -uwww --include-databases={0} --include-tables={1} --skip-watch-progress --compress-output=LZ4 > {2}/{0}/{1}.sql.lz4".format(dbtab[0],dbtab[1],folder)
    os.system(cmd)

    if __name__ == '__main__':
    result = list()
    with open(sys.argv[1],'r') as o:
    lines = csv.reader(o)
    for line in lines:
    result.append(line)
    p = Pool()
    for i in result:
    p.apply_async(run,(i,))
    p.close()
    p.join()
    ```
    alexlip
        9
    alexlip  
    OP
       2020-01-09 21:38:35 +08:00
    @ipwx 代码很简单,已经贴上了,你帮忙看下?
    wuwukai007
        10
    wuwukai007  
       2020-01-09 21:45:35 +08:00
    用线程池直接开 50 个,一样的
    ipwx
        11
    ipwx  
       2020-01-09 22:24:56 +08:00
    @alexlip 我只能说你代码是对的。不信你可以把这段代码放到你自己机器上执行一下:

    https://ideone.com/Ety65q
    ipwx
        12
    ipwx  
       2020-01-09 22:25:09 +08:00
    至少 Python 层面的代码是没问题的。
    ipwx
        13
    ipwx  
       2020-01-09 22:35:30 +08:00
    实在不行你手搓一个多线程试试呗,给你个 demo:

    https://ideone.com/mK2PfL
    alexlip
        14
    alexlip  
    OP
       2020-01-09 22:50:51 +08:00
    @ipwx 好的,谢谢. 我去测试个试试
    leishi1313
        15
    leishi1313  
       2020-01-10 03:00:28 +08:00
    更多像是 mysqldump 的问题而不是 python 的问题
    aaronhua
        16
    aaronhua  
       2020-01-13 09:58:00 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1149 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 23:17 PVG 07:17 LAX 16:17 JFK 19:17
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86