免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3312 | 回复: 6
打印 上一主题 下一主题

python如何实现线程池? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-18 14:13 |只看该作者 |倒序浏览
最近在写一个爬虫,用到多线程,定义一个队列url_queue,所有的线程都从这个队列获得url,然后下载页面,解析页面,获得页面中的url,然后把这些获得的url推入url_queue中,我设想线程的停止条件应该是所有的子线程都暂停了,而且url_queue为空,可是这个停止条件我看threading模块却不知道如何实现,threading模块的join不行,因为我的子线程都是while True循环,而Queue的join似乎也不行,我翻了下Queue的源码,发现有个unfinished_tasks变量,调用put,该变量就+1,调用task_done该变量就-1,而join就是该变量为0时返回,这也不符合我的要求,因为即便该变量为0,那么如果还有线程在运行,那么仍然会有url推入url_queue,求高人解答,刚学python不久,还比较菜,望指点,谢谢,只要能完成目的,如果有更好的思路,欢迎指点,不算感激

论坛徽章:
0
2 [报告]
发表于 2012-04-18 17:18 |只看该作者
没人,悲剧啊

论坛徽章:
0
3 [报告]
发表于 2012-04-18 18:18 |只看该作者
你自己思维逻辑都有问题吧
前面说:
线程的停止条件应该是所有的子线程都暂停了

后面又说:
我的子线程都是while True循环

这不是互相矛盾吗

论坛徽章:
0
4 [报告]
发表于 2012-04-18 20:14 |只看该作者
回复 3# anonymous0502
暂停不是停止,譬如说为了请求url_queue中的元素,结果被block了,唉,感觉python在多线程这方面还不完善,我还是自己造轮子吧


   

论坛徽章:
0
5 [报告]
发表于 2012-04-19 09:17 |只看该作者
block?get()时block不就是等于队列为空吗?
get()也可以设置超时时间,通过捕获异常来判断是否为空
这个网上应该有很多例子吧,有关如何控制子线程、主线程结束的。
有在队列中放入一个特殊数据项的,有通过事件通知的......

论坛徽章:
0
6 [报告]
发表于 2012-04-19 18:10 |只看该作者
回复 5# anonymous0502
谢谢你的回答,我的意思其实是用一个队列既供生产者也供消费者使用,而不是像网上那样,一个供生产者使用,一个供消费者使用,已经想明白了,就是queue的task_done和join方法,重新琢磨了下源码才搞清楚。。


   

论坛徽章:
0
7 [报告]
发表于 2012-04-19 18:16 |只看该作者
是的,还有线程join()和队列join()的方式可以使用。
方法很多
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP