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
billgreen1
V2EX  ›  Python

这种情况应该用多进程还是多线程?

  •  
  •   billgreen1 · 2016-01-08 13:44:13 +08:00 · 2560 次点击
    这是一个创建于 3236 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有 3000+个 csv 文件,每个文件大小从 0(空文件) kb~5M 左右。

    要求:
    1.读入 csv 文件
    2.对 csv 文件处理(耗时 200ms~7s)
    3.将处理好的 csv 存入数据库

    第二步如果并行处理的话应该算是“ embarrassing parallel",最简单的,不涉及锁、数据共享等

    我现在用的是 multiprocessing.Pool, 里面有 apply, apply_async, map, imap, imap_unordered

    concurrency 里面也有一些对应的函数。

    什么情况下该用什么函数?

    我本想根据下列条件自己整理一下的,但是看了很多资料,有点头大。

    1. 阻塞 /非阻塞
    2.同步 /异步
    3.要求有返回结果 /不用返回结果
    4.返回结果必须有序/返回结果可以无序
    9 条回复    2016-01-08 20:16:42 +08:00
    imn1
        1
    imn1  
       2016-01-08 13:46:38 +08:00   ❤️ 1
    不需要改动文件的话,我觉得多进程好
    gamexg
        2
    gamexg  
       2016-01-08 13:48:30 +08:00 via Android
    cpu 负载高的必须多进程。
    io 多的可以选择多线程。
    congeec
        3
    congeec  
       2016-01-08 13:52:33 +08:00
    csv 存到数据库。。你不需要 Python
    billgreen1
        4
    billgreen1  
    OP
       2016-01-08 13:55:46 +08:00
    @imn1 @gamexg ,谢谢,这些我都知道。步骤 3 会涉及到锁吧?毕竟要往数据库的同一张表里写。

    多进程也有几个选项:

    1. 把 main1 并行。
    def main1(path):
    raw_data = read_csv(path)
    result = process(raw_data)
    write_to_database(result)

    2. 仅仅把 process 用多进程。

    你们觉得哪个好?
    cxe2v
        5
    cxe2v  
       2016-01-08 14:03:46 +08:00
    写入数据库用单线程,要写入的数据放在队列里,前面处理可以多线程
    gamexg
        6
    gamexg  
       2016-01-08 14:06:25 +08:00
    第一个。

    除非你用的是 sqlite 数据库,否则这种单纯的写入不需要关心数据库锁。一般可以认为数据库的对并发的处理比用户考虑的仔细。
    进程别开的太多就行。
    billgreen1
        7
    billgreen1  
    OP
       2016-01-08 14:07:51 +08:00
    @congeec 是要对 csv 文件处理后,然后保存到数据库。

    第一步,读取 csv 是阻塞的嘛?
    imn1
        8
    imn1  
       2016-01-08 14:09:08 +08:00
    看独立关系
    如果整个 csv 要一并计算的,我会把从打开、处理到写入作为一个进程
    如果 csv 每条 record 是独立计算的,我会打开若干个 csv 再并入一个队列,多进程计算,再处理写入问题
    em70
        9
    em70  
       2016-01-08 20:16:42 +08:00 via iPhone
    反正我用多进程,编码简单,稳定性高,开 10 个进程,数据库对这点压力不在意
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1580 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:45 · PVG 00:45 · LAX 08:45 · JFK 11:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.