- 论坛徽章:
- 0
|
本帖最后由 okr001610 于 2010-11-19 14:15 编辑
大家好!
最近我在写Perl脚本,读取query文件中的query,向服务器引擎申请查询返回结果。
因为query文件很大(可能有几百万行),因此想到用多进程/线程并发申请。
申请服务器用的是HTTP::Lite库:-
- my $timeout = 5;
- my $return_data='';
- eval
- {
- local $SIG{ALRM} = \&timeout_do;
- alarm $timeout;
- $req = $http->request($qpquery) or die "Unable to get document: $!";
- $return_data = $http->body();
- alarm 0;
- };
复制代码 (怀疑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/
刚才翻看了精华帖,iamlimeng 使用多线程方式抓取web页面时也遇到类似问题。CU论坛看到仙子发的多线程模型,就将自己的代码改造成多线程下载,效率比Teleport快了不少,但仙子给的多线程模型很难控制,下载过程中经常发呆很久,下载失败率很高(10%左右),下载失败的任务无法再继续通过多线程下载(我没找到方法),不能即时显示下载进度,在下载后期经常假死,处于无限期等待状态,程序不再继续运行,不得不手工关闭。仙子发的多进程模型也尝试过,多线程中的问题,多进程同样存在,而且资源消耗非常大。所以不得不放弃,曾对 PERL的多线程和多进程不抱希望;
http://bbs.chinaunix.net/viewthread.php?tid=1722536&extra=page%3D1%26amp%3Bfilter%3Ddigest
不知道大家有没有遇到这种情况?
谢谢 |
|