1.為什麼c語言較python等指令碼語言編寫計算密集型任務效率更高,而python等指令碼語言編寫io密集型任務較c語言效率更高?
答:可能的解釋a:io密集型任務比如web服務,這類服務的開發**可能會經常性的更改、更新,所以需要開發效率較高的**,即**量少,碼起來較快。
2.在進行tcp程式設計,呼叫socket進行通訊時,客戶端傳送資料出去,一定會等到伺服器傳送資料回,才會接著執行後面的**嗎?
答:這是同步io模型。非同步io模型便能有效解決這個問題,使得主線程在等待乙個io操作返回結果的過程中,能繼續執行下面的**。
3.在非同步io模型下,乙個執行緒就可以同時處理多個io請求,並且沒有切換執行緒的操作。對於大多數io密集型的應用程式,使用非同步io將大大提公升系統的多工處理能力。為什麼乙個執行緒處理多個io請求時並沒有切換執行緒的操作,那它又是如何進行多個io請求的處理呢?
答:利用協程,使用yield關鍵字將協程標記為generator,在執行多協程(共享乙個執行緒)時,便能利用yield的中斷及返回值實現協程之間的切換操作,從而實現非同步io。
4.yield表示式如何理解其執行機制?
答:執行如下**:
def consumer():
r = ''
while true:
print(r)
n = yield r
if not n:
return
print('[consumer] consuming %s...' % n)
r = '200 ok'
def produce(c):
c.send(none)
n = 0
while n < 5:
n = n + 1
print('[producer] producing %s...' % n)
r = c.send(n)
print('[producer] consumer return: %s' % r)
c.close()
c = consumer()
produce(c)
結果為:
#空行
[producer] producing 1...
[consumer] consuming 1...
200 ok
[producer] consumer return: 200 ok
[producer] producing 2...
[consumer] consuming 2...
200 ok
[producer] consumer return: 200 ok
[producer] producing 3...
[consumer] consuming 3...
200 ok
[producer] consumer return: 200 ok
[producer] producing 4...
[consumer] consuming 4...
200 ok
[producer] consumer return: 200 ok
[producer] producing 5...
[consumer] consuming 5...
200 ok
[producer] consumer return: 200 ok
分析可發現:凡send(mesg)方法即執行相應generator函式並把mesg賦給當前yield表示式,然後直至遇到下乙個yield關鍵字(如後面無yield,則需.close(),否則會丟擲stopiteration異常),並返回下乙個yield的引數(此例中為r)。
c.send(none)初始化即從函式開始執行,傳入none是因為最開始沒有yield表示式接收賦值,然後直到遇到yield(1號),並返回yield的引數r(為' '),亦跳出consumer函式,回到produce函式中繼續執行下面的**;
遇到c.send(n)又開始切換到consumer中執行,從上次中斷處執行即yield處,將n賦值給本次yield(1號)表示式,然後繼續執行consumer中下面的**,直至遇到下一次yield(2號),返回yield(2號)的引數r,中斷consumer,切換produce函式,接著send(n)繼續執行;如此迴圈,直至produce結束。
總結:有yield表示式的執行方式即是利用c.send(mesg)切換到c函式中執行,
遇到yield表示式,將mesg賦值給yield表示式,繼續執行c函式,
並在下一次yield中斷c函式的執行,並將此時yield的引數r作為c.send(mesg)的返回值,回到c.send(mesg)所在的**處執行下面的**,
再下一次c.send(mesg)從中斷的yield處執行c函式。
python之學習之旅
python簡介及環境搭建 python 英國發音 pa n 美國發音 pa n 是一種物件導向的解釋型 計算機程式語言,由荷蘭人 guido van rossum於1989年發明,第乙個公開發行版發行於1991年。python是純粹的 自由軟體,源 和 直譯器cpython遵循 gpl gnu g...
核心程式設計 驅動之學習筆記
最近學習了核心程式設計,雖然說學的比較淺,但是也不能有一絲絲的懈怠,生怕自己聽不懂,又被班同學落 la 下 就如我的qq個性簽名一樣,有的時候,我們不停地跑啊跑,只是為了能追上那個被寄予厚望的自己 作業系統的核心是非常強大的,強大到令你吃驚,記憶體管理,程序管理,中斷機制,保護機制 核心中沒有程序,...
程式設計 英語 數學之學習方法
程式設計 摘至知乎 零基礎應當如何開始學習 python 注 其他人的回答也同樣精彩,程式語言的學習方法都是通用的 雖然我不是python高手,但我是零基礎,之前會的都是軟體ps,ppt之類。如果目的是想成為程式設計師,參考教學大綱。1,找到合適的入門書籍,大致讀一次,迴圈啊判斷啊,常用類啊,搞懂 ...