注意标题里面有三个keyword,递归 线程池 队列
这是我在开发爬虫程序时候碰到的需求,我们知道爬网页一般都使用广度优先搜索,每个页面下面都可能有下层页面。为了加快爬行速度,我们很容易想到用多线程来实现。
但是多线程必须受控,不能无限的创建线程,这样机器受不了,服务器也受不了。所以多线程必须满足下面条件:
线程数限制,超过限制则加入到队列中等待。同时,线程中允许创建新的线程,我称之为递归线程。
根据这个需求,所以有了标题:递归线程池队列
下面是实现代码
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
namespace MediaSpider {
class TaskQueue {
int poolSize;
Task[] pool;
ConcurrentQueue<Action> queue;
CancellationTokenSource cancelTokenSource=null;
public TaskQueue(int poolSize) {
this.poolSize = poolSize;
// 初始化线程池
pool = new Task[poolSize];
for (int i = 0; i < poolSize; i++) {
pool[i] = Task.Run(() => { });
}
queue