比如说我的爬虫要爬行http://xxx.com/page.php?id=1到http://xxx.com/page.php?id=88的数据,但是由于机器限制我只能开十个线程,那么我怎么做到把这88个抓取任务分配给十个线程,并且以最快的速度完成任务?(Ps:我不要用框架,我想自己原生实现)
比如说我的爬虫要爬行http://xxx.com/page.php?id=1到http://xxx.com/page.php?id=88的数据,但是由于机器限制我只能开十个线程,那么我怎么做到把这88个抓取任务分配给十个线程,并且以最快的速度完成任务?(Ps:我不要用框架,我想自己原生实现)
应该有好几种线程同步方案吧,比如线程池,互斥锁等
讲个我以前用过的大概思路,主线程声明一个堆栈,设置堆栈的最大堆叠数,10个线程就是10Queue.Queue(10)
把堆栈作为变量传入子线程,子线程工作前,往堆栈里插入1个值Queue.put(1,timeout=30)
,完成工作后从堆栈里取出一个值Queue.get()
设置timeout被阻塞的线程会等待30s后再次尝试插入值
2 回答4.3k 阅读✓ 已解决
2 回答846 阅读✓ 已解决
1 回答4.1k 阅读✓ 已解决
3 回答835 阅读✓ 已解决
2 回答2.1k 阅读✓ 已解决
4 回答2.5k 阅读
3 回答886 阅读✓ 已解决
至少三种方法及相应的参考实现:
multiprocessing.dummy:
concurrent.futures.Executor:
queue + Threading:
官方文档:
17.2. multiprocessing — Process-based parallelism — Python 3.5.2 documentation
17.4. concurrent.futures — Launching parallel tasks — Python 3.5.2 documentation
17.7. queue — A synchronized queue class — Python 3.5.2 documentation
17.1. threading — Thread-based parallelism — Python 3.5.2 documentation