Python 多线程跑着跑着挂了,该如何处理

2012-05-27 09:41:42 +08:00
 shiweifu
在写一个爬虫,用Queue配合thread来实现线程池,爬完一个地址,调用一次queue.task_done()
但在爬的过程中,有可能出一些Error,比如TimeOutError什么的,这样的话线程就挂了,永远也不会返回,也就调用不了queue.task_done(),最后就卡住了

请问这种情况该如何处理?

我想的是重写个queue.join(),在其中判断queue是否为空,如果是空的,就说明已经都爬完了,然后就退出,有没有更好的解决方法?
4440 次点击
所在节点    Python
11 条回复
quake0day
2012-05-27 09:55:56 +08:00
try catch pass 不行?
Livid
2012-05-27 09:56:45 +08:00
用 try catch 处理异常。
shiweifu
2012-05-27 09:57:13 +08:00
@quake0day Exception能捕获,Error捕获不了,直接就挂了 = =!
INT21H
2012-05-27 09:58:25 +08:00
global队列,然后 while len(q) > 0:
try-except判断是否timeout,若timeout,该线程q.get()

不能让一个线程挂掉
Livid
2012-05-27 10:02:13 +08:00
或者你可以重新写一下你的程序,用 celery 来实现多任务并行处理。
sivacohan
2012-05-27 10:52:10 +08:00
守护进程。。。。
我是这么干的,一会检查一下那些进程挂掉了。。。。
clowwindy
2012-05-27 10:53:41 +08:00
try except finally 为什么不行?楼主贴一下 except 代码,和异常堆栈信息看看。
reus
2012-05-27 13:54:06 +08:00
用multiprocessing.Pool
shiweifu
2012-05-28 10:26:22 +08:00
@all 已解决,谢谢大家
gonbo
2012-05-28 10:33:56 +08:00
scrapy 这种框架已经很无敌啦。。。。
zealot
2012-06-09 12:17:31 +08:00
scrapy +1

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

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

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

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

© 2021 V2EX