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

一個故事講完進程、線程和協程

開發 開發工具
旺財和小強這兩個程序都很長,每個都有十幾萬行。 他們兩個的人生價值就是到CPU上去運行,把運行結果告訴人類。

很久以前,有兩個程序,暫且稱他們旺財和小強吧。

旺財和小強這兩個程序都很長,每個都有十幾萬行。 他們兩個的人生價值就是到CPU上去運行,把運行結果告訴人類。

[[231810]]

CPU是稀缺資源,只有一個,他們倆必須排著隊,輪流使用。

旺財從頭到尾執行完了,讓出CPU, 讓小強從頭兒去執行。

人類把這種處理方式叫做批處理。

進程

長久以來,兩人相安無事。 后來CPU的速度越來越快, 遠遠超過了內存,硬盤的速度。

人類想到,這批處理系統的效率有點低啊,你看當小強需要從硬盤上讀取數據的時候,CPU也一直在等待,這是多大的浪費啊!這時候完全可以讓旺財來運行一下嘛!

當然得保存好小強的執行現場:具體執行到那一行程序指令了, 函數調用到什么層次了,每個函數調用都有什么樣的參數,CPU寄存器中的值..... 等等一系列東西。

如果不把小強的執行現場給保存下來,等到小強的數據從銀盤讀完了,就沒法回到中斷處來繼續執行了。

這個執行現場,再加上小強的代碼,就是一個執行中的程序,被稱為“進程” 。

旺財和小強在運行的時候,也被改造成了進程。

人類還規定:進程不能長時間占據CPU, 只能在CPU上執行一小會兒,然后馬上切換到別的進程去執行。

旺財和小強不以為意:不就是執行一會兒,歇一會兒,然后繼續執行嘛!

但是他們不知道的是,由于CPU運行速度超快,旺財和小強雖然在不斷地切換運行,在人類那緩慢的世界里看來,旺財和小強好像是同時在執行一樣。  這就是并發。

(在人類看來,小強和旺財似乎是在同時執行)

多年以后,他們倆才真正地實現了并行: 在一個豪華電腦中,每人都被分配了一個CPU , 真正地同時執行, 這是后話了。

線程

這時候旺財已經有了界面,還能訪問網絡,每當它聯網的時候(這也是個非常非常耗時的操作),就得把CPU讓給小強。

即使旺財再次被調度執行,由于網絡數據還沒有返回,他必須等待,什么事情都做不了,在人類看來,界面根本無法操作,旺財不響應了!  氣得人類經常把旺財kill掉。

旺財心里苦,他很納悶小強怎么就沒有問題,小強不是要讀寫硬盤嗎? 那也是很慢的操作啊。

小強說:“你傻啊,內部只有一個執行的流程,一遇到耗時的操作就得等待,你看看我,內部搞了兩個執行流程(線程),一個用來讀寫硬盤(T1),另外一個處理界面(T2)。我和操作系統商量好了,如果T1在讀寫硬盤, 就可以調度我的T2來執行,這樣界面至少還可以操作。 ”

旺財覺得很有意思,也采用了類似辦法。

于是,一個進程中至少有一個執行的流程(主線程),也可以開啟新的執行流程(線程)。

線程變成了最小的調度單位。

協程

這一天,旺財被一個叫做生產者和消費者的問題折騰地死去活來,兩個線程,一個線程向隊列中放數據,另外一個從隊列中取數據,處理起兩個線程的協作就顯得很麻煩,不但需要加鎖,還得做好線程的通知和等待。

正在感慨多線程編程之難的時候, 旺財震驚地發現,小強用了一個極為簡單的辦法把生產者,消費者問題給解決了。

這個方法的代碼如下:

  1. # 生產者 
  2. def producer(c):    
  3.     #其他代碼   
  4.     while True:           
  5.         value = ...生成數據... 
  6.         c.send(value) 
  7.  
  8. # 消費者 
  9. def consumer():     
  10.     #其他代碼       
  11.     while True
  12.         value = yield  
  13.         print(value) 
  14.  
  15. c = consumer() 
  16. producer(c) 

“這....這怎么執行啊,那個yield是怎么回事?”  旺財表示不解。

“簡單啊,你看那個生產者,是不是向消費者發送了數據? ” 小強說。

“對啊,然后呢,生產者發送了數據以后,會馬上進行下一輪循環嗎?”

“這就是關鍵所在了,”小強說,“ 它們是這么執行的:”

  1. 生產者發送數據,暫停運行,不進行下一輪循環
  2. 消費者其實一直在value = yield 那里等待,直到數據到來,現在數據來了,取出處理(value就是生產者發送過來的數據)。
  3. 消費者在循環中再次yield, 暫停執行。
  4. 生產者繼續下一輪的循環,生成新的消息,發送給消費者。

旺財覺得很吃驚,小強竟然可以讓一個正在執行的程序暫停,他不由得問道:“你這個暫停是真的停止了了,還是說只是像Java的yield那樣,讓出CPU進入了就緒狀態? 等待下次調度運行?”

“是真的暫停了,程序就停在那里,等待運行控制權從對方那里轉移過來。”

“這不是操作系統干的事情嗎? ” 旺財更加吃驚了。

“正是這樣,” 小強得意地說:“我打算把類似生產者,消費者這樣的代碼稱為‘協程’, 這個協程有個重要的特點,就是完全被我所調度和掌控, 不用操作系統介入。”

“這個協程和線程似乎很像啊。每次協程停止執行的時候,也得保存現場,要不然沒法恢復執行。” 旺財說。

“是啊,只是他們比線程更加輕量級,操作系統內核不用參與,相當于用戶態線程了,協程的開銷極小,可以輕松地創建大量的協程來做事情。 對了,也許你注意到了,我這兩個協程是'合作式'的,它們兩個同一時刻只能有一個在運行。 實際上,我在底層可以用一個線程去執行這兩個協程。  ”

旺財表示同意:“不錯,既然兩個程序可以'合作',那就不用加鎖了,也不用在代碼里寫什么wait和notify了,在程序層面,可以用同步的方式實現異步的功能了! 代碼很清晰,我也搞個協程來玩玩吧!”

【本文為51CTO專欄作者“劉欣”的原創稿件,轉載請通過作者微信公眾號coderising獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2019-05-30 10:15:30

2023-12-13 09:56:13

?多進程多線程協程

2023-12-17 14:24:46

計算機進程線程

2024-10-22 15:34:57

2023-11-29 08:02:16

線程進程

2013-04-25 09:55:21

進程線程

2021-01-28 11:17:49

Python爬蟲單線程

2020-08-04 10:56:09

進程線程協程

2020-11-29 17:03:08

進程線程協程

2023-09-04 08:08:59

2019-09-18 15:09:50

進程線程操作系統

2020-06-23 10:03:33

版本控制項目

2015-08-05 09:45:25

IOS故事多線程

2012-11-29 09:49:17

軟件項目項目

2023-10-12 09:46:00

并發模型線程

2023-07-03 07:27:41

進程線程Win32

2015-08-13 14:35:43

2024-09-27 11:03:38

2017-09-13 15:45:17

交付軟件遺留系統

2015-09-17 13:26:56

線程數進程Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲激情视频在线 | 五月婷婷在线播放 | 日韩免费av网站 | 免费成人毛片 | 免费观看黄色片视频 | 天天射天天操天天干 | 久久久久91 | 九九综合九九 | 春色av| 亚洲国产精品一区二区久久 | 精品免费国产视频 | 国产视频一区在线观看 | 日韩欧美手机在线 | 精品中文字幕一区 | 国产精品久久久精品 | 国产精品自产拍在线观看蜜 | 美女黄色在线观看 | 成人精品一区二区三区中文字幕 | 毛片免费看 | 欧美aa在线 | 久久人体视频 | 精品九九 | 精品国产乱码久久久久久牛牛 | 成av人电影在线 | 91视频大全| 天天精品在线 | 亚洲一区二区三区在线免费 | 狠狠av | 男女黄网站 | 久久i| 中文字幕91 | 日韩久久久久 | 久久久久久久久99精品 | 日韩三区在线 | 搞av.com| 超碰人人爱 | 日韩欧美三级在线 | 国产99久久 | 欧美精品久久久久久久久久 | 91av在线视频观看 | 国产成人高清在线观看 |