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

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

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1895 | 回復(fù): 7
打印 上一主題 下一主題

pppk之Recipe5.3(1) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-08-21 20:18 |只看該作者 |倒序?yàn)g覽
本帖最后由 zhuyubei 于 2012-08-21 20:19 編輯

今天我們講Recipe5.3: Hash的鎖,分2天完成。在我完成這個(gè)Recipe之前,我以前沒接觸過這方面的內(nèi)容。所以實(shí)踐下來,感覺有些收獲。hash的鎖操作,為多線程下的編程提供了一定的安全機(jī)制。也許我下面的Recipe會趁熱打鐵繼續(xù)講鎖,只不過是Recipe7.18文件鎖。

本Recipe引用語句是
  1. 我這里有《王摩詰全集》,你且把他的五言律讀一百首,細(xì)心揣摩透熟 了,然后再讀一二百首老杜的七言律,次再李青蓮的七言絕句讀一二百首。肚子 里先有了這三個(gè)人作了底子,然后再把陶淵明、應(yīng)瑒,謝、阮、庾、鮑等人的一 看。你又是一個(gè)極聰敏伶俐的人,不用一年的工夫,不愁不是詩翁了! --《紅樓夢》林黛玉
復(fù)制代碼
我們順便再回顧下我實(shí)踐的進(jìn)展
在pppk/目錄下,有個(gè)文件叫Readme。如果你checkout了,你可以看下我實(shí)現(xiàn)的進(jìn)展
Recipe  P1     P2      RootRecipe
1.1        Perl        Python
1.2         Perl         Python       
1.3        Perl        Python        1.1
1.4
5.1         Perl                5.3
5.2         Perl                5.3
5.3     Perl
5.4         Perl                5.3
5.6         Perl                5.3
7.11         Perl
8.2        Perl
8.4        Perl                       

我們講了Recipe1.1, Recipe1.2。 但其實(shí)我已經(jīng)完成了一些Recipe。其中有些Recipe會以類似的情況出現(xiàn)在其他的Recipe里,這樣我們就不費(fèi)心去完成這些Recipe.

應(yīng)該說python這塊,我做得比較吃力。有些力不從心。關(guān)鍵是,我期望能用和Perl類似那樣的標(biāo)準(zhǔn)庫去實(shí)現(xiàn),但是情況不是很理想。當(dāng)然我Python弱不少。好在畢竟是Perl的板塊,Perl這塊還是盡力完成了。當(dāng)然有這個(gè)文件做參照,我們一定會把它都完成的。

每完成一個(gè)Recipe,就像《圣斗士》里打冥界的時(shí)候沙加手里的佛珠串一樣,又會有一顆佛珠變黑了。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-08-21 20:25 |只看該作者
無論要不要鎖住Hash,為了方便我們都需要去展示一個(gè)Hash。當(dāng)然可以用Dumper之類的方法。不過我們參照Recipe5.6,寫了個(gè)一個(gè)函數(shù)來完成它:
  1. sub printHash
  2. {
  3.         my ( $rhAHash ) = shift;
  4.         if ( $rhAHash and ( ref($rhAHash) eq "HASH" ) ){
  5.                 print "+++++ Hash Begin\n";
  6.                 print map { "Key: [$_] and Value: [$rhAHash->{ $_ }]\n" } keys %{ $rhAHash };
  7.                 print "+++++ Hash End\n";
  8.         }
  9. }
復(fù)制代碼
處于效率考慮,我們傳了個(gè)散列的引用進(jìn)去,并會做簡單的檢查。然后我們利用map函數(shù)來引發(fā)打印的動作
。對于map函數(shù),記得小駱駝的最后幾章有介紹。大家可以參考之。當(dāng)然也許以后的Recipe我也會涉及。我們會利用這個(gè)函數(shù)來顯示一個(gè)hash

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-08-21 20:29 |只看該作者
本帖最后由 zhuyubei 于 2012-08-22 00:04 編輯

為了要對Hash進(jìn)行鎖操作,需要導(dǎo)入模塊,并import可能所需要的函數(shù)

  1. use Hash::Util qw( lock_keys unlock_keys

  2.                 lock_value unlock_value

  3.                 lock_hash unlock_hash

  4. );
復(fù)制代碼
其中l(wèi)ock_keys可以鎖住當(dāng)前hash的keys,或所指定的keys,而lock_value可以鎖住指定key對應(yīng)的value。而lock_hash則可以鎖住整個(gè)Hash的Key/Value

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-08-21 20:40 |只看該作者
我們先創(chuàng)建一個(gè)示例Hash
  1. my %hTestHash = ( "TWO" => 2, "THREE" => 3);
  2. # Recipe 5.1
  3. $hTestHash{ ONE } = 1;
復(fù)制代碼
下面我們試圖鎖住這個(gè)hash當(dāng)前的key,再試圖刪除在鎖之前就已經(jīng)存在的一個(gè)Key
  1. # Lock keys here
  2. lock_keys( %hTestHash );
  3. # Recipe 5.4
  4. # We can still the keys before locked
  5. delete $hTestHash{ ONE };

  6. # Recipe 5.2  
  7. if( not exists $hTestHash{ ONE } ){
  8.         print "ONE deleted!\n";
  9. }
  10. # Recipe 5.6
  11. printHash( \%hTestHash);
復(fù)制代碼
通過輸出語句,我們看到在key鎖住之后,被鎖前的Key居然可以刪除掉。

那我們能不能新增一個(gè)鎖之前沒有的Key呢?
  1. eval{
  2.         $hTestHash{ FOUR } = 4;
  3. };
  4. print "Illegal operation when the hash is locked:\n$@" if $@;
復(fù)制代碼
這里我們插入FOUR => 4這條記錄,但是被拋出異常了!表示似乎不能增加新的Key。那我們又問,剛剛我們刪除掉的Key: ONE, 在鎖之前它就存在,那它能不能現(xiàn)在又被加回來呢?我們嘗試了下:
  1. # We can add the keys had been existed before the keys was locked
  2. eval{
  3.         $hTestHash{ ONE } = 1;
  4. };
  5. print "We can add the keys had been existed in hash before the keys were locked\n" if not $@;
  6. printHash( \%hTestHash );
復(fù)制代碼
注意這里是if not $@。這表明我們insert成功了。所以lock_keys在這里的意思是,你可以修改,刪除,添加鎖之前就存在的Key, 但是絕對不能增加鎖之前就沒有的key!

接著我們用unlock_keys釋放鎖,現(xiàn)在我們又可以正常加新的記錄了
  1. # Unlock keys now and insert new entry
  2. unlock_keys( %hTestHash );
  3. $hTestHash{ FOUR } = 4;
  4. printHash( \%hTestHash );
復(fù)制代碼

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-08-21 20:46 |只看該作者
接著我們講lock_hash。這個(gè)函數(shù)將整個(gè)Hash都鎖住了,不可改動。
這里修改值,刪除Key, insert新的值,都不可行。
  1. print "Testing of lock_hash\n";
  2. lock_hash( %hTestHash );
  3. eval{# We can't modify the value here
  4.         $hTestHash{ ONE } = 5;
  5. };
  6. print "We can't modify the value of key 'ONE', when it is locked:[$@]" if $@;
  7. eval{# Can't delete
  8.         delete $hTestHash{ ONE };
  9. };
  10. print "We can't delete key 'ONE' when the hash is locked:[$@]" if $@;
  11. eval{# Can't insert
  12.         $hTestHash{ ZERO } = 0 ;
  13. };
  14. print "We can't insert key 'ZERO' when the hash is locked:[$@]" if $@;
  15. printHash(  \%hTestHash );
  16. # Recover it
  17. unlock_hash( %hTestHash );
復(fù)制代碼
用unlock_hash可以釋放鎖。這樣Hash又可以正常操作了。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-08-21 20:49 |只看該作者
明天我們講lock_value。這個(gè)函數(shù)會有些細(xì)節(jié),所以要稍微多說下。另外Python我目前還沒有找到庫函數(shù)對原生dict有這樣的鎖支持,雖然我們可以寫個(gè)包裝類出來,但是還是不能和Perl這樣的功能相比。等我找到了合適的標(biāo)準(zhǔn)庫,再來進(jìn)行更新。

論壇徽章:
2
CU大;照
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
7 [報(bào)告]
發(fā)表于 2012-08-22 15:59 |只看該作者
堅(jiān)持就是勝利...

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-08-22 17:06 |只看該作者
本帖最后由 sjdy521 于 2012-08-22 17:07 編輯

前幾天還在看這個(gè)模塊,想了解下內(nèi)部的實(shí)現(xiàn)原理是什么,看的比較暈乎,實(shí)現(xiàn)的機(jī)制看似不像是和use field一樣
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP