成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Perl線程的生命周期

開發 架構
本文向大家簡單介紹Perl線程的生命周期的概念,Perl線程作為Perl中的一種實體,其一生可以粗略的分為創建,運行與退出這三個階段。

本文和大家重點討論一下Perl線程的生命周期,主要包括創建Perl線程,join方法和detach方法兩大部分內容,希望通過本文的介紹你對Perl線程的生命周期有一定的認識。

Perl線程的生命周期

創建Perl線程

Perl線程作為Perl中的一種實體,其一生可以粗略的分為創建,運行與退出這三個階段。創建使得Perl線程從無到有,運行則是Perl線程完成其主要工作的階段,退出自然就是指Perl線程的消亡。Perl線程的運行和普通函數的執行非常類似,有其入口參數,一段特定的代碼流程以及執行完畢后返回的一個或一組結果,唯一與普通函數調用的不同之處就在于新建Perl線程的執行與當前Perl線程的執行是并行的。

Perl里創建一個新的Perl線程非常簡單,主要有兩種方法,他們分別是:

使用threads包的create()方法,例如

清單3.通過create()方法創建Perl線程    
 

  1. usethreads;  
  2.  
  3. subsay_hello  
  4. {  
  5. printf("Hellothread!@_.\n");  
  6. return(rand(10));  
  7. }  
  8.  
  9. my$t1=threads->create(\&say_hello,"param1","param2");  
  10. my$t2=threads->create("say_hello","param3","param4");  
  11. my$t3=threads->create(  
  12. sub{  
  13. printf("Hellothread!@_\n");  
  14. return(rand(10));  
  15. },  
  16. "param5",  
  17. "param6");  
  18.  

 使用async{}塊創建Perl線程,例如

清單4.通過async{}塊創建Perl線程    
 

  1. #!/usr/bin/perl  
  2. #  
  3. usethreads;  
  4.  
  5. my$t4=async{  
  6. printf("Hellothread!\n");  
  7. };  
  8.  

#p# 

join方法和detach方法

Perl線程一旦被成功創建,它就立刻開始運行了,這個時候你面臨兩種選擇,分別是join或者detach這個新建Perl線程。當然你也可以什么都不做,不過這可不是一個好習慣,后面我們會解釋這是為什么。

我們先來看看join方法,這也許是大多數情況下你想要的。從字面上來理解,join就是把新創建的Perl線程結合到當前的主Perl線程中來,把它當成是主Perl線程的一部分,使他們合二為一。join會觸發兩個動作,首先,主Perl線程會索取新建Perl線程執行結束以后的返回值;其次,新建Perl線程在執行完畢并返回結果以后會自動釋放它自己所占用的系統資源。例如

清單5.使用join()方法收割新建Perl線程    
 

  1. #!/usr/bin/perl  
  2. #  
  3. usethreads;  
  4.  
  5. subfunc{  
  6. sleep(1);  
  7. return(rand(10));  
  8. }  
  9.  
  10. my$t1=threads->create(\&func);  
  11. my$t2=threads->create(\&func);  
  12.  
  13. printf("dosomethinginthemainthread\n");  
  14.  
  15. my$t1_res=$t1->join();  
  16. my$t2_res=$t2->join();  
  17.  
  18. printf("t1_res=$t1_res\nt2_res=$t2_res\n");  
  19.  

  由此我們不難發現,調用join的時機是一個十分有趣的問題。如果調用join方法太早,新建Perl線程尚未執行完畢,自然就無法返回任何結果,那么這個時候,主Perl線程就不得不被阻塞,直到新建Perl線程執行完畢之后,才能獲得返回值,然后資源會被釋放,join才能結束,這在很大程度上破話了Perl線程之間的并行性。相反,如果調用join方法太晚,新建Perl線程早已執行完畢,由于一直沒有機會返回結果,它所占用的資源就一直無法得到釋放,直到被join為止,這在很大程度上浪費了寶貴的系統資源。因此,join新建Perl線程的最好時機應該是在它剛剛執行完畢的時候,這樣既不會阻塞當前Perl線程的執行,又可以及時釋放新建Perl線程所占用的系統資源。

我們再來看看detach方法,這也許是最省心省力的處理方法了。從字面上來理解,detach就是把新創建的Perl線程與當前的主Perl線程剝離開來,讓它從此和主Perl線程無關。當你使用detach方法的時候,表明主Perl線程并不關心新建Perl線程執行以后返回的結果,新建Perl線程執行完畢后Perl會自動釋放它所占用的資源。

一個新建Perl線程一旦被detach以后,就無法再join了。當你使用detach方法剝離Perl線程的時候,有一點需要特別注意,那就是你需要保證被創建的Perl線程先于主Perl線程結束,否則你創建的Perl線程會被迫結束,除非這種結果正是你想要的,否則這也許會造成異常情況的出現,并增加程序調試的難度。

本節的開始我們提到,新Perl線程被創建以后,如果既不join,也不detach不是一個好習慣,這是因為除非明確地調用detach方法剝離Perl線程,Perl會認為你也許要在將來的某一個時間點調用join,所以新建Perl線程的返回值會一直被保存在內存中以備不時之需,它所占用的系統資源也一直不會得到釋放。然而實際上,你打算什么也不做,因此寶貴的系統資源直到整個Perl應用結束時才被釋放。同時,由于你即沒有調用join有沒有調用detach,應用結束時Perl還會返回給你一個Perl線程非正常結束的警告。

Perl線程的消亡

大多數情況下,你希望你創建的Perl線程正常退出,這就意味著Perl線程所對應的函數體在執行完畢后返回并釋放資源。例如在清單5的示例中,新建Perl線程被join以后的退出過程。可是,如果由于detach不當或者由于主線因某些意外的異常提前結束了,盡管它所創建的Perl線程可能尚未執行完畢,但是他們還是會被強制中止,正所謂皮之不存,毛將焉附。這時你也許會得到一個類似于“Perlexitedwithactivethreads”的警告。

當然,你也可以顯示地調用exit()方法來結束一個Perl線程,不過值得注意的是,默認情況下,如果你在一個Perl線程中調用了exit()方法,其他Perl線程都會隨之一起結束,在很多情況下,這也許不是你想要的,如果你希望exit()方法只在調用它的Perl線程內生效,那么你在創建該Perl線程的時候就需要設置’exit’=>’thread_only’。例如


清單7.為某個Perl線程設置’exit’=>’thread_only’屬性    
 

  1. #!/usr/bin/perl  
  2. #  
  3. usethreads;  
  4.  
  5. subsay_hello{  
  6. printf("Hellothread!@_.\n");  
  7. sleep(10);  
  8. printf("Bye\n");  
  9. }  
  10.  
  11. subquick_exit{  
  12. printf("Iwillbeexitinnotime\n");  
  13. exit(1);  
  14. }  
  15.  
  16. my$t1=threads->create(\&say_hello,"param1","param2");  
  17. my$t2=threads->create({'exit'=>'thread_only'},\&quick_exit);  
  18.  
  19. $t1->join();  
  20. $t2->join();  
  21.  

 

如果你希望每個Perl線程的exit方法都只對自己有效,那么在每次創建一個新Perl線程的時候都去要顯式設置’exit’=>’thread_only’屬性顯然有些麻煩,你也可以在引入threads包的時候設置這個屬性在全局范圍內有效。

【編輯推薦】

  1. 追溯Perl線程的歷史
  2. 解析Perl正則表達式中的模式
  3. Perl二維數組用法全程剖析
  4. 淺析Perl面向對象編程用法
  5. Perl正則表達式語法解析
責任編輯:佚名 來源: ibm.com
相關推薦

2010-07-14 10:59:15

Perl線程

2009-06-18 13:32:39

Java線程生命周期

2012-01-16 09:00:56

線程

2009-06-29 18:03:15

Java多線程線程的生命周期

2023-10-26 08:25:35

Java線程周期

2015-07-08 16:28:23

weak生命周期

2022-04-19 07:20:24

軟件開發安全生命周期SSDLC應用安全

2009-06-11 11:28:35

JSF生命周期

2012-04-28 13:23:12

Java生命周期

2011-06-16 09:31:21

ActivityAndroid

2020-03-30 13:20:58

線程Java編程語言

2019-10-16 10:50:13

Linux內核測試

2013-07-29 05:11:38

iOS開發iOS開發學習類的'生命周期'

2009-06-17 15:06:50

Hibernate實體

2012-06-20 10:29:16

敏捷開發

2009-06-24 10:47:55

JSF生命周期

2013-08-19 17:03:00

.Net生命周期對象

2021-07-19 05:52:29

網絡生命周期網絡框架

2020-09-08 15:14:51

線程 APIs周期

2015-07-09 15:42:48

ios應用生命周期
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费在线观看av网址 | 国产精品国产 | 欧美中文字幕一区二区三区 | 国产小视频在线 | 羞羞视频在线观看网站 | 国产精品美女一区二区三区 | 久久逼逼 | 91看片| 色播久久久 | 成人精品一区 | 日韩精品一区二区三区中文字幕 | 国产精品一区二区三区在线 | 91天堂 | 欧美日韩国产一区 | 色视频网站在线观看 | 国产午夜精品久久久 | 亚洲人成人网 | 欧美日韩精品久久久免费观看 | 在线免费观看色 | 久久亚洲一区二区 | 成人欧美日韩一区二区三区 | 欧美激情久久久 | av大片| 成人伊人网 | 亚洲精品一区av在线播放 | 日本公妇乱淫xxxⅹ 国产在线不卡 | 亚洲综合婷婷 | 国产精品亚洲二区 | 国产精品a一区二区三区网址 | 久久成人18免费网站 | 最新毛片网站 | 影音先锋中文字幕在线观看 | 成人精品久久 | 毛片视频观看 | 成人在线免费视频 | 超碰日本| 91视频一88av | 日韩精品免费视频 | 91麻豆精品国产91久久久更新资源速度超快 | 午夜视频免费在线观看 | 一区视频|