{:9_227:}
下下来看看
@Stubborn 楼主,如果这句话for t in crawl_threads: t.join()在parser_threads = [] parser_name = ["parser_1","parser_2","parser_3"]之前,是不是相当于还是单线程运行
本帖最后由 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 ...
到这里已经是采集线程结束了,关闭采集线程了
#等待队列情况
while not pageQueue.empty(): #判断是否为空 采集队列
pass
采集线程空了,没有任务,所以结束了采集(或者说生产数据线程)
最好你说下是哪行
Stubborn 发表于 2019-7-30 20:39
到这里已经是采集线程结束了,关闭采集线程了
采集线程空了,没有任务,所以结束了采集(或者说生产 ...
while循环的用途我知道,我就是想问你的顺序是初始化采集线程->初始化解析线程->等待采集队列。。。。如果换一下顺序 初始化采集线程->等待采集队列->等待采集主线程结束 然后才去处理解析线程这样和你的结果是一样的吗?或者说有什么不同(其他具体执行程序不变)
fan1993423 发表于 2019-7-31 13:56
while循环的用途我知道,我就是想问你的顺序是初始化采集线程->初始化解析线程->等待采集队列。。。。如 ...
虽然不知道你为什么有这个想法,不过看程序走就知道,采集线程的全部数据都是在往data队列里面存的。然后解析线程再从data队列里面取。结果没有测试,从代码上来看,结果会一样,但是速度就没有那么快,既然用了线程,就肯定是要求速度方面的,等待采集结束,再开解析,大致相当于,慢了一半的速度,具体我没有测试过,看代码说的,你有兴趣可以测试下
Stubborn 发表于 2019-7-31 17:08
虽然不知道你为什么有这个想法,不过看程序走就知道,采集线程的全部数据都是在往data队列里面存的。然后 ...
我觉得这个可不可以理解采集完成一部分后就交了一部分给解析,从而加快速度
fan1993423 发表于 2019-7-31 17:15
我觉得这个可不可以理解采集完成一部分后就交了一部分给解析,从而加快速度
可以的,当采集和解析运行之后,解析线程就会从data队列里面取数据,里面一旦有数据,就进行解析,从而加速的
Stubborn 发表于 2019-7-31 21:32
可以的,当采集和解析运行之后,解析线程就会从data队列里面取数据,里面一旦有数据,就进行解析,从而加 ...
嗯,但是有个问题,python有GIL锁,在这里没开多进程的情况下,也就是单进程多线程,那么我有个疑问就是假设总速度不变,你现在将一部分采集给了解析,那么解析那部分会不会占用采集,从而使采集因为线程被占,速度变慢。而且你这个没加锁的话,有没有可能出现线程紊乱的情况?
来了
fan1993423 发表于 2019-8-1 10:04
嗯,但是有个问题,python有GIL锁,在这里没开多进程的情况下,也就是单进程多线程,那么我有个疑问就是 ...
解析线程为什么会被占用?看下代码,这个并不要锁,基于生产消费者模型,你看代码可以看到,所有采集线程的采集数据,全部往队列里面存。而所有解析,都是从队列里面取数据,唯一可能产生混乱的地方,就是保存的部分,可以看看开头,和代码贴里面,保存图片有何不同。另外什么地方需要加锁?线程大致的了解下可以参考这个链接点击我前往
学习了!!!
Mark 一下
谢谢
学习学习
启动了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线程
退出主线程
这是什么原因大佬
我直接来看答案了{:10_254:}{:10_277:}
w454227 发表于 2019-8-11 22:35
启动了crawl_1线程
当前正在工作的线程是:crawl_1,正在采集第1个页面
启动了crawl_2线程
没有采集到东西,估计改了规则了把
0
66