python 多进程遇到的几个令人疑惑问题,求解!

2013-12-30 10:17:12 +08:00
 justfly
实现一个爬虫,使用了python的进程池,multiprocessing.Pool,其中process个数设为multiprocessing.cpu_count()。然后遇到三个十分诡异的问题:

1. 进程池启动的进程有一些根本不干活,正在工作的进程少于process个数

2. 进程池中进程完成一个任务后就停止了,等到所有进程都完成了任务再开始新的一轮。比如说,进程池10个进程,每个取一个任务来执行,执行结束进程不再取新任务,貌似是退出了,等到池内10个进程任务都完成,然后10个进程都重新启动去取任务。

3.进程池在所有任务没有完成的且没有异常的情况下私自退出!

进程池每个进程执行一样的任务,任务中有多次次数据库读写和http请求。

困扰很长时间,希望解答
16694 次点击
所在节点    Python
5 条回复
justfly
2013-12-30 10:34:38 +08:00
主要代码如下:

pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())

for book in books:
....pool.apply_async(task, (book.book_id, book.cp_id))

pool.close()
pool.join()
hahastudio
2013-12-30 10:34:44 +08:00
1. 不清楚= =

2. Pool的话,只要池里有一个结束了就能上新任务吧
你说的“等到所有进程都完成了任务再开始新的一轮”应该是因为你这几个进程基本同时开的,工作任务基本一致,然后就基本能同时做完,那么当然感觉上是都做完了再开新的一轮。

现象你可以跑下面的代码看看,比如我这里Process 0 先跑完,然后8就跟着起来了,而不是等1~7结束

3. 是不是主进程没有pool.join()?

https://gist.github.com/hahastudio/8177137
hahastudio
2013-12-30 10:36:50 +08:00
撞上了= =有join的话= =不清楚= =
powerfj
2013-12-30 13:06:47 +08:00
建议别用多进程编程,坑多,可以试试gevent,如果scrapy可以实现功能,就用scrapy吧..
thwawar
2013-12-30 20:12:57 +08:00
@powerfj 赞同!用 gevent 即清晰又省内存

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

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

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

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

© 2021 V2EX