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

2013-07-17 13:52:00 +08:00
 ratatata
一直多线程没搞懂,跟着 http://www.ibm.com/developerworks/cn/aix/library/au-threadingpython/index.html 这个走了一遍,发现如果不定义 while True,好像也没什么区别。但是在搜到的其他的 python 线程编程中,都发现会在 run 中定义一个 while 循环,这是为什么呢?
4046 次点击
所在节点    Python
9 条回复
breeswish
2013-07-17 14:13:00 +08:00
举个栗子:

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

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

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

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

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

so,没事别用线程,要用线程先想清楚竞争条件

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

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

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

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

© 2021 V2EX