+ -
当前位置:首页 → 问答吧 → perl 多线程多进程导致长时间休眠

perl 多线程多进程导致长时间休眠

时间:2010-11-19

来源:互联网

本帖最后由 okr001610 于 2010-11-19 10:48 编辑

大家好!
最近我在写Perl脚本,读取query文件中的query,向服务器引擎申请查询返回结果。
因为query文件很大(可能有几百万行),因此想到用多进程/线程并发申请。
申请服务器用的是HTTP::Lite库:
  1.     my $timeout = 5;
  2.     eval
  3.     {
  4.         local $SIG{ALRM} = \&timeout_do;
  5.         alarm $timeout;
  6.         $req = $http->request($qpquery) or die "Unable to get document: $!";
  7.         $qpdata = $http->body();
  8.         alarm 0;
  9.     };
复制代码
(怀疑HTTP::Lite超时导致线程/进程阻塞以致长时间休眠,所以加上ALAM信号)

多进程方式:用的是很粗暴的方法:把query文件split成5个,分别运行5脚本请求。
多线程方式:
1. 使用Thread:: Queue,开一个读线程读取query到 read_queue中,启动多个线程读取read_queue,结果都写到write_queue,再开一个写线程读取write_queue,输出结果.
2.直接开几个子线程,分别读取query文件去申请服务器,分别输出结果到不同的临时文件,主线程收割完所有子线程,再分别把临时文件整合到一起。
  现在我遇到一个很奇怪的问题,上面三种实现方式,程序跑起来一段时间,总是有某个线程/进程“休眠”掉--一直休眠,不被系统调度运行。这样会持续会很久(多进程的话有几个小时,多线程方式甚至是几天)。

google搜了下,信息很少,发现以前有人遇到类似的,可惜他的问题没人解答:
perl processes stalling/sleeping
http://code.activestate.com/lists/perl-win32-users/11914/

不知道大家有没有遇到这种情况?
谢谢

作者: okr001610   发布时间: 2010-11-19

楼主为什么不用数据库

作者: zhlong8   发布时间: 2010-11-19



QUOTE:
楼主为什么不用数据库
zhlong8 发表于 2010-11-19 10:48


服务器端其实是个搜索引擎,我负责抓取数据分析,呵呵

作者: okr001610   发布时间: 2010-11-19