免费注册 查看新帖 |

Chinaunix

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

一个libcurl的例子 [复制链接]

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-26 00:17 |只看该作者 |倒序浏览
本帖最后由 ttcn_cu 于 2012-04-26 00:18 编辑

写了一个基于libcurl并行http get工具,测试网站的http返回
我那它测了下某知名电商网站,目的未知,后果不明

说说结果,结果随着时间的变动似乎有很大的不确定性,0点以前,一直连不上超时,0点以后,感觉一下子清爽了许多,对方似乎复位了某些网络设备。

希望网站的运维看到这个不要生气 纯属测试
  1. #!/usr/bin/perl
  2. use strict;
  3. use 5.010;
  4. use warnings;
  5. use Data::Dumper;

  6. use Net::Curl::Multi qw(:constants);
  7. use Net::Curl::Easy qw(:constants);
  8. use Net::Curl::Form qw(:constants);
  9. my %curl_request;
  10. my %resps;
  11. my $time = shift // 1;
  12. my $url = shift //'www.baidu.com';
  13. say "run $url $time times";
  14. for my $i (1..$time) {
  15.     my $curl = Net::Curl::Easy->new;
  16.     $curl->setopt(CURLOPT_URL, $url);
  17.     $curl->setopt(CURLOPT_WRITEDATA,\$resps{$i});
  18.     $curl->setopt(CURLOPT_HEADER,1);
  19.     $curl->setopt(CURLOPT_TIMEOUT,10);

  20.     $curl_request{$i} = $curl;
  21. }
  22. my $active_handles = 0;
  23. my $curlm = Net::Curl::Multi->new;
  24. my $u_total=0;
  25. my $d_total=0;
  26. for (keys %curl_request){
  27.     $curlm->add_handle($curl_request{$_});
  28.     $active_handles++;
  29. }
  30. my $running = 0;
  31. do {
  32.     my ($r, $w, $e) = $curlm->fdset();
  33.     my $timeout = $curlm->timeout();
  34.     select $r, $w, $e, $timeout / 1000
  35.         if $timeout > 0;
  36.     $running = $curlm->perform();
  37.     while ( my ( $msg, $easy, $result ) = $curlm->info_read() ) {
  38.         $curlm->remove_handle( $easy );
  39.     }
  40. } while ( $running );

  41. my %r;
  42. for (values %resps){
  43.     if(!defined $_){
  44.         $r{TIMEOUT}++;
  45.     }
  46.     elsif (/(HTTP[^\x0a\x0d]*)/xsm){
  47.         $r{$1}++;

  48.     }


  49. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-04-26 06:24 |只看该作者
写过多线程下载网页的代码,效率很高,一直用着。不知道这个跟使用threads有什么区别?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2012-04-26 09:04 |只看该作者
看了一下libcurl,不知道它的这个是多线程还是非阻塞IO。
这种网络上的并行问题肯定首选是Coro,我一直用Coro,到目前为止非常稳定。而且支持线程池,速度极快,消耗资源很小。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
4 [报告]
发表于 2012-04-26 09:06 |只看该作者
回复 3# py


    非阻塞IO吧,libcul很出名了,是C实现的,效率也不容小视。经常用它打死我的网卡(内网)。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
5 [报告]
发表于 2012-04-26 09:08 |只看该作者
回复 2# iamlimeng


    不是说Perl的多线程是出了名的bug多么,偶至今没敢怎么碰它。

论坛徽章:
0
6 [报告]
发表于 2012-04-26 10:37 |只看该作者
回复 5# ttcn_cu

还好吧,避开那些容易出问题的做法就行。CORO曾经用过,有一些问题,不知道最近的版本是不是已经解决了,可能是我没深入学习它,后来没关注。

用threads+lwp,下载大量的网页(每次约5000个),速度极快,因为我以前用Teleport下网页,感觉有很明显的速度提升,TP是个好软件,但已经被我弃用了。

论坛徽章:
1
狮子座
日期:2013-12-16 16:09:24
7 [报告]
发表于 2012-04-26 11:03 |只看该作者
回复 6# iamlimeng


    你不妨把我这种方法和你的多线程方法PK下,看看哪种效率如何(前提是你用linux环境,可以安装libcurl库)
    我试过多进程+并发非阻塞IO的http请求,能满足我的大流量需求,
    多线程的因为不了解,所以没有尝试过。
   
顺便提一句,我也试过lwp的并行模式,似乎有很多bug。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2012-04-26 11:05 |只看该作者
回复 6# iamlimeng

能说说是什么问题吗?Coro

我最近用Coro用的挺频繁的
   

论坛徽章:
0
9 [报告]
发表于 2012-04-26 11:47 |只看该作者
回复 8# py

我是要折腾一个批量下载网页的小程序,要求下载速度快,程序运行时,有进度显示。曾经用过CORO,碰到几个问题:
1、运行到程序后期,容易假死,也就是有一部分线程(如果可以叫线程的话)可能是无限等待或别的原因,卡死了,不能回收,导致进度显示也假死,最终整个程序也会死掉;
2、系统开销相对用threads+LWP要大许多,占用资源过多;
3、下载的效率不及threads+LWP,相对要慢一些。

这些问题,我自己不能得到解决,就改用threads+LWP了,可能是没认真把这个模块学好的原因吧。我是MS平台,而且需要打包成可执行程序发给朋友用。也许在Linux系统会不一样吧,但我没测试过!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2012-04-26 13:19 |只看该作者
回复 9# iamlimeng

多线程和非阻塞在不同情况下有各自的优势,批量下载网页这种事情,我觉得用非阻塞更好。

我不知道你的Coro是怎么写的,但如果说Coro的开销比threads大,那一定是你的Coro写的严重不合理。

我最近比较详细的研究了Coro和相关模块的文档,简单的Coro很好写,但容易被用错。我假设你用的是Coro+LWP,我开始也是这么用没出什么问题,但看到Coro::LWP的文档,Coro+LWP属于下册,而且本身就是存在问题(虽然我没遇到)。

我是用Coro+AnyEvent::HTTP,这样的组合就完美多了。(这个“完美”是Coro的作者说的),并且Coro支持线程池(按照作者的叫法),这样效率又有很大的提高(根据作者说,是2倍)。我也是用Coro批量下载网页,速度很快占用资源很少。但是我自己没有亲自测试过Coro+LWP和threads+LWP的效率对比,我是看到别人的测试结果。

To ttcn_cu:
不推荐libcurl是因为libcurl能做的事情太单一,有很大局限性。threads和Coro至少是一类的东西,而且Coro和AnyEvent的整合效果更好,现在event based programming还是很流行的,建议你试试Coro。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP