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

queue 模块对象的 task_done 方法有什么用?

  •  
  •   defias · 2015-11-01 09:55:08 +08:00 · 4301 次点击
    这是一个创建于 3337 天前的主题,其中的信息可能已经有所发展或是发生改变。
    python 的 queue 队列中的任务取出一个执行完后,需要调用 task_done 方法来通知 queue ,不知道这个有什么作用,因为本来 get 方法在从 queue 中取任务时,就会从 queue 中删掉已取出的任务。如果不调用 task_done 会怎么样?比如当 get 取出一个任务后执行完又 put 放回 queue 中的情况。
    4 条回复    2015-11-01 13:07:50 +08:00
    exploitcat
        1
    exploitcat  
       2015-11-01 10:10:22 +08:00
    不 task_done 线程退不出来,队列是阻塞的
    Damnever
        2
    Damnever  
       2015-11-01 11:37:57 +08:00
    放入队列的个数要和 task_done 调用次数相等,也就是说你每取出来一个,必须 task_done ,要不然计数不相等, join 的时候就不知道什么时候退出
    lcqtdwj
        3
    lcqtdwj  
       2015-11-01 12:11:56 +08:00
    这是一种同步机制
    defias
        4
    defias  
    OP
       2015-11-01 13:07:50 +08:00
    谢谢各位的回复,大概的明白了一些。
    @Damnever 你这里的 join 应该指的是队列的 join : Queue.join() 吧,如果代码中没用用到 Queue.join() 而是用线程的 join ,即主线程中用 sonthread.join(60)来等待子线程运行完成或超时,而不关心 queue 中的任务是否完成(因为可能根本无法完成),那么是否从 queue 中取出来一个后,用不用 task_done 都没关系了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   960 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 20:21 · PVG 04:21 · LAX 12:21 · JFK 15:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.