DAY7-Python學習筆記

前記:html

這幾天在弄小程序,view頁面的開發很簡單,可是在加載圖片上遇到了問題,小程序的大小不能超過2M,因此大部分的圖片內容要經過request請求服務器來獲取,這裏以前學習小程序的時候是經過網站API接口實現的,可是如今想要加載自定義的圖片,一開始的想法是看看能不能本身來寫後端寫接口,但是我是個後端小白麪對一大堆新知識顯得有點措手不及,查閱資料發現TX本身有一個基於Node.js的後端Demo,但是拿到這個Demo看了看源碼仍是一臉懵逼,非常苦惱。想着開始學後端吧,找了一些視頻發現大可能是PHP的,這樣我又要學習PHP了,時間根本不夠。而後陷入了一個瓶頸。可是在玩弄Demo時發現有個上傳圖片的功能試了試,居然發現返回了一個URL,立刻實驗了下發現居然能返回我剛纔上傳的圖片!欣喜若狂!而後知道了有COS對象存儲這種東西,簡直不要太爽,自定義上傳圖片記下URL就解決了我以前的問題,關於COS還在學習,明天試一試把!編程

 

1.異步IO:小程序

當代碼須要執行一個耗時的IO操做時,它只發出IO指令,並不等待IO結果,而後就去執行其餘代碼了。一段時間後,當IO返回結果時,再通知CPU進行處理後端

 

2.協程(coroutine):又稱微線程,可看作子程序,Python對協程的支持是經過generator實現的服務器

 

Donald Knuth的一句話總結協程的特色:「子程序就是協程的一種特例。」網絡

 

3.asyncio:對異步IO的支持的內置標準庫併發

 

asyncio的編程模型就是一個消息循環,從asyncio模塊中直接獲取一個EventLoop的引用,把須要執行的協程扔到EventLoop中執行就實現了異步IO:異步

 

import asyncio @asyncio.coroutine #把一個generator標記爲coroutine類型
def hello(): print("Hello world!") # 異步調用asyncio.sleep(1):
    r = yield from asyncio.sleep(1) print("Hello again!") # 獲取EventLoop:
loop = asyncio.get_event_loop() # 執行coroutine
loop.run_until_complete(hello()) loop.close()

 

hello()會首先打印出Hello world!,而後yield from語法調用另外一個generator,socket

asyncio.sleep()也是一個coroutine(協程),因此線程不會等待asyncio.sleep(),而是直接中斷並執行下一個消息循環,當asyncio.sleep()返回時,線程就能夠從yield from拿到返回值(此處是None),而後接着執行下一行語句。把asyncio.sleep(1)當作是一個耗時1秒的IO操做,在此期間,主線程並未等待,而是去執行EventLoop中其餘能夠執行的coroutine了,所以能夠實現併發執行。async

咱們用asyncio的異步網絡鏈接來獲取sina、sohu和163的網站首頁:

import asyncio @asyncio.coroutine def wget(host): print('wget %s...' % host) connect = asyncio.open_connection(host, 80) reader, writer = yield from connect header = 'GET / HTTP/1.0\r\nHost: %s\r\n\r\n' % host writer.write(header.encode('utf-8')) yield from writer.drain() while True: line = yield from reader.readline() if line == b'\r\n': break
        print('%s header > %s' % (host, line.decode('utf-8').rstrip())) # Ignore the body, close the socket
 writer.close() loop = asyncio.get_event_loop() tasks = [wget(host) for host in ['www.sina.com.cn', 'www.sohu.com', 'www.163.com']] loop.run_until_complete(asyncio.wait(tasks)) loop.close()

 

結果:可見3個鏈接由一個線程經過coroutine併發完成。

 

wget www.sohu.com... wget www.sina.com.cn... wget www.163.com... (等待一段時間) (打印出sohu的header) www.sohu.com header > HTTP/1.1 200 OK www.sohu.com header > Content-Type: text/html ... (打印出sina的header) www.sina.com.cn header > HTTP/1.1 200 OK www.sina.com.cn header > Date: Wed, 20 May 2015 04:56:33 GMT ... (打印出163的header) www.163.com header > HTTP/1.0 302 Moved Temporarily www.163.com header > Server: Cdn Cache Server V2.0 ...

 

 

4.async/await:從Python 3.5開始引入了新的語法,讓coroutine的代碼更簡潔易讀。

兩段代碼對比:把@asyncio.coroutine替換爲async;把yield from替換爲await

 

@asyncio.coroutine def hello(): print("Hello world!") r = yield from asyncio.sleep(1) print("Hello again!") async def hello(): print("Hello world!") r = await asyncio.sleep(1) print("Hello again!")

 

 

5.aiohttp能夠實現單線程併發IO操做

 

後記:

囫圇吞棗總算是把教程學完了,一個星期的時間,可是大部分的語法仍是掌握不牢固,雖然在寫總結可是沒有複習過本身的筆記,無論怎麼樣總算是搞完了。下一步就是實戰了,激動人心的時刻! 最近事情是真的有點多也有點煩,可是這7天堅持下來了仍是很滿意的!將來的路還很長,抓緊時間啊!別揮霍青春了,努力了!你不會比任何人

相關文章
相關標籤/搜索