免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3925 | 回复: 4
打印 上一主题 下一主题

perl 多线程多进程导致长时间假死 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-19 10:46 |只看该作者 |倒序浏览
本帖最后由 okr001610 于 2010-11-19 14:15 编辑

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

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

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2010-11-19 10:48 |只看该作者
楼主为什么不用数据库

论坛徽章:
0
3 [报告]
发表于 2010-11-19 10:50 |只看该作者
楼主为什么不用数据库
zhlong8 发表于 2010-11-19 10:48

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

论坛徽章:
0
4 [报告]
发表于 2010-11-22 10:55 |只看该作者
顶一下,没有人遇到perl多线程假死的问题吗?

论坛徽章:
0
5 [报告]
发表于 2010-11-22 13:01 |只看该作者
我帖子里提到仙子给的模型,是最最基本的模型,肯定不能解决你的问题。

Perl对多线程支持,很晚才出现,可能Perl的内核太复杂,不能做大的改动,所以多线程支持不完善。

你的程序运行过程中有假死现象,不一定是多线程的问题。因为Perl对多线程支持较晚才出现,目前很多CPAN上的模块,都不是线程安全的,在多线程中使用这些模块,就会出现这样那样的问题。要根本解决这个问题,楼主可能需要自己实现很多你引用的模块的功能。这是没有办法的事。

我帖子里黑色阳光的多线程模型是非常可靠的,它本身不会假死,你可以根据你的需要改一下你的程序。我一直在用这个模型,只有LWP下载失败的时候才有假死问题,线程本身没有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP