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

2016-01-08 13:44:13 +08:00
 billgreen1
有 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.返回结果必须有序/返回结果可以无序
2560 次点击
所在节点    Python
9 条回复
imn1
2016-01-08 13:46:38 +08:00
不需要改动文件的话,我觉得多进程好
gamexg
2016-01-08 13:48:30 +08:00
cpu 负载高的必须多进程。
io 多的可以选择多线程。
congeec
2016-01-08 13:52:33 +08:00
csv 存到数据库。。你不需要 Python
billgreen1
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
2016-01-08 14:03:46 +08:00
写入数据库用单线程,要写入的数据放在队列里,前面处理可以多线程
gamexg
2016-01-08 14:06:25 +08:00
第一个。

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

第一步,读取 csv 是阻塞的嘛?
imn1
2016-01-08 14:09:08 +08:00
看独立关系
如果整个 csv 要一并计算的,我会把从打开、处理到写入作为一个进程
如果 csv 每条 record 是独立计算的,我会打开若干个 csv 再并入一个队列,多进程计算,再处理写入问题
em70
2016-01-08 20:16:42 +08:00
反正我用多进程,编码简单,稳定性高,开 10 个进程,数据库对这点压力不在意

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

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

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

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

© 2021 V2EX