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

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

  •  
  •   justfly · 2013-12-30 10:17:12 +08:00 · 16847 次点击
    这是一个创建于 4010 天前的主题,其中的信息可能已经有所发展或是发生改变。
    实现一个爬虫,使用了python的进程池,multiprocessing.Pool,其中process个数设为multiprocessing.cpu_count()。然后遇到三个十分诡异的问题:

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

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

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

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

    困扰很长时间,希望解答
    5 条回复    1970-01-01 08:00:00 +08:00
    justfly
        1
    justfly  
    OP
       2013-12-30 10:34:38 +08:00   ❤️ 1
    主要代码如下:

    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
        2
    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
        3
    hahastudio  
       2013-12-30 10:36:50 +08:00   ❤️ 1
    撞上了= =有join的话= =不清楚= =
    powerfj
        4
    powerfj  
       2013-12-30 13:06:47 +08:00
    建议别用多进程编程,坑多,可以试试gevent,如果scrapy可以实现功能,就用scrapy吧..
    thwawar
        5
    thwawar  
       2013-12-30 20:12:57 +08:00
    @powerfj 赞同!用 gevent 即清晰又省内存
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   976 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 23:00 · PVG 07:00 · LAX 15:00 · JFK 18:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.