perl 多线程多进程导致长时间休眠
时间:2010-11-19
来源:互联网
本帖最后由 okr001610 于 2010-11-19 10:48 编辑
大家好!
最近我在写Perl脚本,读取query文件中的query,向服务器引擎申请查询返回结果。
因为query文件很大(可能有几百万行),因此想到用多进程/线程并发申请。
申请服务器用的是HTTP::Lite库:
复制代码
(怀疑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/
不知道大家有没有遇到这种情况?
谢谢
大家好!
最近我在写Perl脚本,读取query文件中的query,向服务器引擎申请查询返回结果。
因为query文件很大(可能有几百万行),因此想到用多进程/线程并发申请。
申请服务器用的是HTTP::Lite库:
- my $timeout = 5;
- eval
- {
- local $SIG{ALRM} = \&timeout_do;
- alarm $timeout;
- $req = $http->request($qpquery) or die "Unable to get document: $!";
- $qpdata = $http->body();
- alarm 0;
- };
多进程方式:用的是很粗暴的方法:把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
zhlong8 发表于 2010-11-19 10:48
服务器端其实是个搜索引擎,我负责抓取数据分析,呵呵
作者: okr001610 发布时间: 2010-11-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28