多个线程操作的问题!

yizhixiaozhu 2010-11-10 07:37:27
举个例子:

一个爬虫 1个是爬网,将内容取下来,一个是分析内容,为了加快速度,

我想用2个线程,一个用来爬网,一个用来分析爬下来的数据,

但是之间我想用队列保存爬网的数据,之前想用一个队列,爬网进程负责将爬下来的结果加入队列中,分析数据的代码负责从队列中取出结果分析

但是这样的话,必须在写入队列和取出队列的时候,都要加锁,所以我想用多个队列,比如3或者4个,每个队列保存100条记录

爬网的代码当写满一个队列后,就通知分析数据的进程来分析这个队列,然后爬网的代码重新将结果写入到另外一个队列中,

但是当我分析网页的代码分析了一个队列后,需要对下一个队列进行分析,但是有可能下一个队列可能那个爬的线程还在写数据,因为爬网比较慢,这个时候该怎么办?

换句话说就是 2个线程该如何通信? 假如爬网的爬完了一个,该如果通知分析的来分析? 但是这个时候可能那个分析线程正在分析另外一个队列,分析线程分析完了,如果去得到下一个可以分析的队列,有可能这个时候还没有可以分析的对列。




请高手赐教!!

谢谢了
...全文
99 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wshwh 2010-11-10
  • 打赏
  • 举报
回复
Bool thread2alive=false;
Autoresetevent are =new Autoresetevent(false);
List<object> list = new List<object>();

Thread1fuc()
{
object obj=null;
while((obj = 爬网())!=null)
{
Lock(list)
{
list.add(obj);
}
are.set();
}
}

Thread2fuc()
{
thread2alive=false;
object obj=null;
while(thread2alive)
{
are.waitOne();
while(list.count>0)
{
Lock(list)
{
obj =list[0];
list.Removeat(0);
}
分析(ojb);
}
}
}

分析(object ojb)
{
//******
}
yizhixiaozhu 2010-11-10
  • 打赏
  • 举报
回复
如果爬网的线程触发这个事件的时候,那个分析线程还在分析另外一个队列,这个时候会发生什么情况?

SadEmprie 2010-11-10
  • 打赏
  • 举报
回复
可以考虑用Windows.Messaging带的队列,支持异步读写,而且自己可以维护锁。

对于“写满”通知的问题,可以用C#的自定义事件。

首先从EventArgs派生一个自己的事件类,里面定义已写满的队列名称,爬网的线程在写满后触发这个事件;

分析的线程启动后订阅该事件,在事件处理程序中取出已写满的队列名,然后开始分析处理。
yizhixiaozhu 2010-11-10
  • 打赏
  • 举报
回复
谢谢楼上二位:

我上面的只是具体个例子,如果这2个功能一定要使用2个线程的话,那他们之间的队列该如何操作,

一个队列直接加锁就好了,如果是我上面的说的,使用多个队列来保存结果的话,应该就不需要加锁,就是不知道该如何通知对方去做相应的操作。
whb147 2010-11-10
  • 打赏
  • 举报
回复
下载可以开多个
分析这个不好说,你也可以用多个,互相不干扰的
兔子-顾问 2010-11-10
  • 打赏
  • 举报
回复
分析时间基本可以忽略不计。和下载放在一个线程比较合理。下载到是适合开多个线程去下载。

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧