亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
123下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 4880 | 回復(fù): 24
打印 上一主題 下一主題

從一段 AnyEvent 代碼看閉包的使用 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-06-23 00:28 |只看該作者 |倒序?yàn)g覽
本帖最后由 3P主義 于 2012-06-23 12:15 編輯

閉包就是帶局部狀態(tài)的函數(shù),利用閉包,可以傳送大量數(shù)據(jù)給函數(shù)。相對(duì)于傳參方式,主要有以下兩個(gè)優(yōu)點(diǎn):
1. 傳送的數(shù)據(jù)量大。
2. 靈活,能突破參數(shù)個(gè)數(shù)的限制。

上述的優(yōu)點(diǎn)2在回調(diào)代碼中更明顯,因?yàn)榛卣{(diào)函數(shù)接受的參數(shù)都已確定了,不能再傳遞額外的參數(shù)。

以下用 AnyEvent::HTTP 演示閉包的使用,代碼中一共有 1000 個(gè)關(guān)鍵詞要查詢,創(chuàng)建了 $cocurrent 個(gè)回調(diào)函數(shù),每個(gè)回調(diào)函數(shù)都引用著外部的 @words 和 $word ,注意回調(diào)函數(shù)是怎么再次回調(diào)自身的
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. use AnyEvent;
  5. use AnyEvent::HTTP;


  6. my $cocurrent = 100;    # 并發(fā)數(shù)
  7. my @words = map { "keyword" . $_ } (1 .. 1000); # 待查詢的關(guān)鍵詞

  8. my $cv = AnyEvent->condvar;
  9. my @c = splice(@words, 0, $cocurrent);

  10. foreach my $word (@c) { # 同時(shí)創(chuàng)建 $cocurrent 個(gè)請(qǐng)求
  11.     $cv->begin();
  12.     my $cb;
  13.     $cb = sub {
  14.         my ($content, $hdr) = @_;

  15.         print "Search: $word\tStatus: ", $hdr->{Status}, "\n";
  16.         $cv->end();

  17.         if (defined ($word = shift(@words))) {
  18.             $cv->begin();
  19.             http_get("http://www.baidu.com/s?wd=${word}", $cb);
  20.         }
  21.     };

  22.     http_get("http://www.baidu.com/s?wd=${word}", $cb);
  23. }

  24. $cv->recv();
復(fù)制代碼
以上代碼,每一個(gè)請(qǐng)求返回時(shí),會(huì)重新創(chuàng)建一個(gè)新請(qǐng)求,并發(fā)數(shù)一直控制在 $cocurrent 個(gè),工作良好。

論壇徽章:
2
射手座
日期:2014-10-10 15:59:4715-16賽季CBA聯(lián)賽之上海
日期:2016-03-03 10:27:14
2 [報(bào)告]
發(fā)表于 2012-06-23 02:24 |只看該作者
回復(fù) 1# 3P主義


    8錯(cuò),學(xué)習(xí)了~

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-06-23 03:34 |只看該作者
登個(gè)記 有時(shí)間來(lái)看

論壇徽章:
1
獅子座
日期:2013-12-16 16:09:24
4 [報(bào)告]
發(fā)表于 2012-06-23 05:18 |只看該作者
回復(fù) 1# 3P主義

學(xué)習(xí)了!
    請(qǐng)問(wèn)  
1.  
my $cb;
   
$cb = sub {
這段能定義在foreach前面么?

2.
這個(gè)代碼有沒(méi)有遞歸特性(堆棧大小限制)?還是被AE給回避了遞歸?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-06-23 08:39 |只看該作者
ttcn_cu 發(fā)表于 2012-06-23 05:18
回復(fù) 1# 3P主義

學(xué)習(xí)了!



1。 必須放在 foreach  中。
2。 沒(méi)有用到遞歸。

論壇徽章:
2
CU大;照
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
6 [報(bào)告]
發(fā)表于 2012-06-23 09:59 |只看該作者
學(xué)習(xí)了,一直不太清楚何為閉包?

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
7 [報(bào)告]
發(fā)表于 2012-06-23 10:13 |只看該作者
這程序可讀性咋那么差呢?

寫成下面這樣不好嗎?
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. use AnyEvent;
  5. use AnyEvent::HTTP;

  6. my $cocurrent = 100;    # 并發(fā)數(shù)
  7. my @todoList = map { "keyword" . $_ } (1 .. 1000); # 待查詢的關(guān)鍵詞

  8. my $cv = AnyEvent->condvar;

  9. doit() foreach 1..$cocurrent;

  10. sub doit{
  11.     my $word = shift @todoList;
  12.     return if not defined $word;

  13.     $cv->begin;
  14.     http_get( "http://www.baidu.com/s?wd=$word", sub { done( $word, @_ ) } );
  15. }

  16. sub done {
  17.     my ($word, $content, $hdr) = @_;

  18.     $cv->end();
  19.     print "Search: $word\tStatus: ", $hdr->{Status}, "\n";
  20.     doit();
  21. }
復(fù)制代碼

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
8 [報(bào)告]
發(fā)表于 2012-06-23 10:14 |只看該作者
記。篋on't repeat yourself

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2012-06-23 10:26 |只看該作者
時(shí)間和乳溝一樣,擠一擠還是有的。

ding   支持

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
10 [報(bào)告]
發(fā)表于 2012-06-23 11:21 |只看該作者
本帖最后由 py 于 2012-07-04 14:50 編輯

回復(fù) 7# flw

看到樓主這個(gè)帖子我有一個(gè)問(wèn)題。

用Coro+AnyEvent::HTTP可以寫出一樣功能的代碼,兩者都是非阻塞。這樣一來(lái),Coro就是可有可無(wú)了。Coro的優(yōu)勢(shì)是什么?(答案見(jiàn)17樓)
   
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP