鱼C论坛

 找回密码
 立即注册

扫一扫,访问微社区

楼主: Stubborn

[作品展示] 我胡汉三又回来了,这次给鱼油带来多线程爬虫案例,以及踩过的深坑

  [复制链接]
最佳答案
0 
发表于 2019-7-27 15:36:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-7-27 16:35:58 | 显示全部楼层
下下来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
17 
发表于 2019-7-30 17:49:03 | 显示全部楼层
@Stubborn 楼主,如果这句话for t in crawl_threads: t.join()在parser_threads = [] parser_name = ["parser_1","parser_2","parser_3"]之前,是不是相当于还是单线程运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
50 
 楼主| 发表于 2019-7-30 20:39:52 | 显示全部楼层
本帖最后由 Stubborn 于 2019-7-30 20:42 编辑
fan1993423 发表于 2019-7-30 17:49
@Stubborn 楼主,如果这句话for t in crawl_threads: t.join()在parser_threads = [] parser_name = ["pars ...


到这里已经是采集线程结束了,关闭采集线程了
  1.     #等待队列情况
  2.     while not pageQueue.empty(): #判断是否为空 采集队列
  3.         pass
复制代码

采集线程空了,没有任务,所以结束了采集(或者说生产数据线程)

最好你说下是哪行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
17 
发表于 2019-7-31 13:56:14 | 显示全部楼层
Stubborn 发表于 2019-7-30 20:39
到这里已经是采集线程结束了,关闭采集线程了

采集线程空了,没有任务,所以结束了采集(或者说生产 ...

while循环的用途我知道,我就是想问你的顺序是初始化采集线程->初始化解析线程->等待采集队列。。。。如果换一下顺序 初始化采集线程->等待采集队列->等待采集主线程结束 然后才去处理解析线程这样和你的结果是一样的吗?或者说有什么不同(其他具体执行程序不变)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
50 
 楼主| 发表于 2019-7-31 17:08:17 | 显示全部楼层
fan1993423 发表于 2019-7-31 13:56
while循环的用途我知道,我就是想问你的顺序是初始化采集线程->初始化解析线程->等待采集队列。。。。如 ...

虽然不知道你为什么有这个想法,不过看程序走就知道,采集线程的全部数据都是在往data队列里面存的。然后解析线程再从data队列里面取。结果没有测试,从代码上来看,结果会一样,但是速度就没有那么快,既然用了线程,就肯定是要求速度方面的,等待采集结束,再开解析,大致相当于,慢了一半的速度,具体我没有测试过,看代码说的,你有兴趣可以测试下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
17 
发表于 2019-7-31 17:15:10 | 显示全部楼层
Stubborn 发表于 2019-7-31 17:08
虽然不知道你为什么有这个想法,不过看程序走就知道,采集线程的全部数据都是在往data队列里面存的。然后 ...

我觉得这个可不可以理解采集完成一部分后就交了一部分给解析,从而加快速度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
50 
 楼主| 发表于 2019-7-31 21:32:38 | 显示全部楼层
fan1993423 发表于 2019-7-31 17:15
我觉得这个可不可以理解采集完成一部分后就交了一部分给解析,从而加快速度

可以的,当采集和解析运行之后,解析线程就会从data队列里面取数据,里面一旦有数据,就进行解析,从而加速的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
17 
发表于 2019-8-1 10:04:17 | 显示全部楼层
Stubborn 发表于 2019-7-31 21:32
可以的,当采集和解析运行之后,解析线程就会从data队列里面取数据,里面一旦有数据,就进行解析,从而加 ...

嗯,但是有个问题,python有GIL锁,在这里没开多进程的情况下,也就是单进程多线程,那么我有个疑问就是假设总速度不变,你现在将一部分采集给了解析,那么解析那部分会不会占用采集,从而使采集因为线程被占,速度变慢。而且你这个没加锁的话,有没有可能出现线程紊乱的情况?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-8-1 13:33:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
50 
 楼主| 发表于 2019-8-1 16:26:32 | 显示全部楼层
fan1993423 发表于 2019-8-1 10:04
嗯,但是有个问题,python有GIL锁,在这里没开多进程的情况下,也就是单进程多线程,那么我有个疑问就是 ...

解析线程为什么会被占用?看下代码,这个并不要锁,基于生产消费者模型,你看代码可以看到,所有采集线程的采集数据,全部往队列里面存。而所有解析,都是从队列里面取数据,唯一可能产生混乱的地方,就是保存的部分,可以看看开头,和代码贴里面,保存图片有何不同。另外什么地方需要加锁?线程大致的了解下可以参考这个链接点击我前往
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-8-1 16:38:58 | 显示全部楼层
学习了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-8-7 15:55:19 | 显示全部楼层
Mark 一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-8-7 21:49:14 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-8-11 19:26:01 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-8-11 22:35:19 | 显示全部楼层
启动了crawl_1线程
当前正在工作的线程是:crawl_1,正在采集第1个页面
启动了crawl_2线程
启动了crwal_3线程
当前正在工作的线程是:crwal_3,正在采集第2个页面
当前正在工作的线程是:crawl_2,正在采集第3个页面
启动了parser_1线程
启动了parser_2线程
启动了parser_3线程
退出了crwal_3线程
退出了crawl_2线程
退出了crawl_1线程
退出了parser_2线程
退出了parser_3线程
退出了parser_1线程
退出主线程
这是什么原因大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-8-12 14:43:41 | 显示全部楼层
我直接来看答案了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
50 
 楼主| 发表于 2019-8-12 21:23:43 | 显示全部楼层
w454227 发表于 2019-8-11 22:35
启动了crawl_1线程
当前正在工作的线程是:crawl_1,正在采集第1个页面
启动了crawl_2线程

没有采集到东西,估计改了规则了把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-9-8 10:36:06 From FishC Mobile | 显示全部楼层
0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 2019-9-8 10:54:25 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号

GMT+8, 2019-10-19 07:59

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表