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

为什么要在 threading.Thread 的 run 中定义 “while True:”?

  •  
  •   ratatata · 2013-07-17 13:52:00 +08:00 · 4038 次点击
    这是一个创建于 4140 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一直多线程没搞懂,跟着 http://www.ibm.com/developerworks/cn/aix/library/au-threadingpython/index.html 这个走了一遍,发现如果不定义 while True,好像也没什么区别。但是在搜到的其他的 python 线程编程中,都发现会在 run 中定义一个 while 循环,这是为什么呢?
    9 条回复    1970-01-01 08:00:00 +08:00
    breeswish
        1
    breeswish  
       2013-07-17 14:13:00 +08:00   ❤️ 1
    举个栗子:

    需要监听一个队列,监听操作是阻塞操作. 因此用了多线程

    如果没有while true: 队列来消息以后,处理完毕,线程结束
    如果有while true: 来消息,处理完毕,继续监听下一个消息
    BOYPT
        2
    BOYPT  
       2013-07-17 14:14:46 +08:00   ❤️ 1
    没有都吧,看你的Thread需要干什么而已。需要他一直在等某事情就while True咯,只需要他一干完就滚蛋就直接从头到尾写咯。
    nybux
        3
    nybux  
       2013-07-17 14:36:29 +08:00   ❤️ 1
    举个例子吧:比如你后台每隔5分钟要扫描一些东西。你可以每隔5分钟启动一个线程,做完后结束。但是更稳妥的方法是启动一个线程,让她一直干。扫描完一次后让他睡5分钟。
    这个也就是你看到的
    while True:
    work()
    这种模式
    GordianZ
        4
    GordianZ  
    MOD
       2013-07-17 15:08:49 +08:00
    @nybux 这个线程到底是男的还是女的……
    nybux
        5
    nybux  
       2013-07-17 15:39:44 +08:00
    @GordianZ 这个联想太奇妙了
    nybux
        6
    nybux  
       2013-07-17 15:40:00 +08:00
    @GordianZ 说的是输入法
    sykp241095
        7
    sykp241095  
       2013-07-17 16:56:37 +08:00
    太搞笑了。
    ratatata
        8
    ratatata  
    OP
       2013-07-17 17:08:11 +08:00
    @breeswish
    @BOYPT
    @nybux
    多谢回复,的确豁然开朗。

    我现在在学习做一个爬虫,爬百度,深度定为 1 的时候,可以在链接全部爬完的时候,自动结束进程,返回结果,运行良好。
    但在爬取深度定为 2 的时候,就会出现当队列里为空且不会再有新链接进来的时候,线程就一直处于 while True 的死循环了...

    代码如下:
    https://gist.github.com/zackmore/6018982

    各位大侠能否帮忙看看问题出在哪?感激不尽
    binux
        9
    binux  
       2013-07-17 17:17:17 +08:00   ❤️ 1
    @ratatata
    首先,你的while True压根就没有退出条件
    然后我就想,你第一步是怎么正常返回的,于是有以下几个猜测:
    1、你起了不止一个线程吧
    2、然后你只wait了最后一个线程吧
    3、if self.uncrawl_queue.qsize():
    ————url = self.uncrawl_queue.get()
    竞争导致最后一个线程异常退出了

    so,没事别用线程,要用线程先想清楚竞争条件
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2043 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:50 · PVG 08:50 · LAX 16:50 · JFK 19:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.