python有1000个url请求 放到queue 再十个线程 这样输出的数据是乱的 必须加锁么 10
有个问题我有1000个url(每个requests请求url执行的操作是一样的,请求以后有返回然后会调用函数再输出)放到queue然后十个线程这样输出的数据是乱的必须加锁...
有个问题 我有1000个url(每个requests请求url执行的操作是一样的,请求以后有返回 然后会调用函数 再输出) 放到queue 然后十个线程 这样输出的数据是乱的 必须加锁么?加锁不是一次就一个线程 不是又慢了啊 另外不是说queue有自带锁机制吗
展开
2个回答
展开全部
题主的问题表述不清,尤其十个线程做了哪些工作没说明,我从字面猜测,是把1000个url放在队列里,然后十个线程从队列中取出url,请求之后,调用输出函数。
先说队列的问题,通常的设计里,queue只在添加元素,摘取元素的时候内部加锁,以保证队列数据不出错,至于从queue中取出数据后怎么处理,要不要放临界区,queue是不管的,也不应该管,python的Queue模块提供了相应的Queue类。
再说输出结果是乱的,又是表述不清,如果你指的是最终输出到一个文件里,文件内容乱了,那给你4种解决办法:
1. 线程里每个url在请求到内容后,在写文件时设立临界区,保证串行输出,强烈不建议这种方式。
2. 对每个url的请求内容写一个文件,最后合并文件,这种最灵活。
3. 对每个工作线程的输出写一个文件,最后合并文件,最有并行style
4. 对每个url的请求内容再次写到一个队列里,另一个线程读取此队列写文件,最有设计模式style
如果你要保证输出结果是与输入url同序的,建议你采用上面第2种办法,合并文件的时候保证与url队列同序
先说队列的问题,通常的设计里,queue只在添加元素,摘取元素的时候内部加锁,以保证队列数据不出错,至于从queue中取出数据后怎么处理,要不要放临界区,queue是不管的,也不应该管,python的Queue模块提供了相应的Queue类。
再说输出结果是乱的,又是表述不清,如果你指的是最终输出到一个文件里,文件内容乱了,那给你4种解决办法:
1. 线程里每个url在请求到内容后,在写文件时设立临界区,保证串行输出,强烈不建议这种方式。
2. 对每个url的请求内容写一个文件,最后合并文件,这种最灵活。
3. 对每个工作线程的输出写一个文件,最后合并文件,最有并行style
4. 对每个url的请求内容再次写到一个队列里,另一个线程读取此队列写文件,最有设计模式style
如果你要保证输出结果是与输入url同序的,建议你采用上面第2种办法,合并文件的时候保证与url队列同序
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询