亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python中asyncio模塊的深入講解

系統(tǒng) 1956 0

1. 概述

Python中 asyncio 模塊內(nèi)置了對異步IO的支持,用于處理異步IO;是Python 3.4版本引入的標(biāo)準(zhǔn)庫。

asyncio 的編程模型就是一個消息循環(huán)。我們從 asyncio 塊中直接獲取一個 EventLoop 的引用,然后把需要執(zhí)行的協(xié)程扔到 EventLoop 中執(zhí)行,就實(shí)現(xiàn)了異步IO。

2. 用asyncio實(shí)現(xiàn)Hello world

            
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2019/1/9 11:23
# @Author : Arrow and Bullet
# @FileName: test.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/qq_41800366
import asyncio

@asyncio.coroutine
def hello():
 print("Hello world!")
 # 異步調(diào)用asyncio.sleep(2): 
 yield from asyncio.sleep(2)
 print("Hello again!")

# 獲取EventLoop:
loop = asyncio.get_event_loop()
# 執(zhí)行coroutine
loop.run_until_complete(hello())
loop.close()
          

@asyncio.coroutine 把一個 generator 標(biāo)記為 coroutine 類型,然后,我們就把這個 coroutine 扔到 EventLoop 中執(zhí)行。

hello() 會首先打印出Hello world!,然后,yield from語法可以讓我們方便地調(diào)用另一個generator。由于 asyncio.sleep() 也是一個 coroutine,所以線程不會等待 asyncio.sleep() ,而是直接中斷并執(zhí)行下一個消息循環(huán)。當(dāng)asyncio.sleep()返回時,線程就可以從yield from拿到返回值(此處是None),然后接著執(zhí)行下一行語句。

把a(bǔ)syncio.sleep(2)看成是一個耗時2秒的IO操作(比如讀取大文件),在此期間,主線程并未等待,而是去執(zhí)行 EventLoop 中其他可以執(zhí)行的 coroutine 了,因此可以實(shí)現(xiàn)并發(fā)執(zhí)行。

我們用task封裝兩個coroutine試試:

            
import threading
import asyncio


@asyncio.coroutine
def hello():
 print('Hello world! (%s)' % threading.currentThread())
 yield from asyncio.sleep(2)
 print('Hello again! (%s)' % threading.currentThread())


loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
          

觀察執(zhí)行過程:

Hello world! (<_MainThread(MainThread, started 140735195337472)>)
Hello world! (<_MainThread(MainThread, started 140735195337472)>)
(暫停約2秒)
Hello again! (<_MainThread(MainThread, started 140735195337472)>)
Hello again! (<_MainThread(MainThread, started 140735195337472)>)

由打印的當(dāng)前線程名稱可以看出,兩個 coroutine 是由同一個線程并發(fā)執(zhí)行的。

如果把 asyncio.sleep() 換成真正的IO操作,則多個 coroutine 就可以由一個線程并發(fā)執(zhí)行。

我們用asyncio的異步網(wǎng)絡(luò)連接來獲取sina、sohu和163的網(wǎng)站首頁:

            
import asyncio


@asyncio.coroutine
def wget(host):
 print('wget %s...' % host)
 connect = asyncio.open_connection(host, 80) # 創(chuàng)建連接
 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()
          

執(zhí)行結(jié)果如下:

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
...

可見3個連接由一個線程通過coroutine并發(fā)完成。

3. 小結(jié)

asyncio提供了完善的異步IO支持;

異步操作需要在coroutine中通過yield from完成;

多個coroutine可以封裝成一組Task然后并發(fā)執(zhí)行。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品免费在线播放 | 日本不卡高清免费v日本 | 亚洲高清资源 | 一级毛片www | 五月狠狠亚洲小说专区 | 国产一级久久久久久毛片 | 久久综合九色综合97婷婷女人 | 亚洲一区 中文字幕 | 综合7799亚洲伊人爱爱网 | 色站综合| 国产成人一区免费观看 | 国产福利专区精品视频 | 中文字幕 亚洲一区 | 五月天婷婷在线播放 | 四虎影视入口 | 欧美午夜毛片a级在线 | 夜夜爽66| 九九资源站 | 亚洲人成免费网站 | 日韩精品一区二区三区中文 | 国内精品久久久久久久久 | 嫩草成人国产精品 | 国产日产精品 | 97免费在线观看 | 在线观看视频91 | 欧美精品在线免费观看 | 深夜在线观看 | 人人做人人性 | 97色老99久久九九爱精品 | 91亚洲精品久久91 | 国内精品久久国产大陆 | 波多野给衣一区二区三区 | 亚洲一区二区视频 | 精品欧美一区二区精品久久 | 国产在线麻豆精品 | 久久精品综合一区二区三区 | 一级看片 | 成人国产在线视频 | 亚洲伦理视频 | 日本综合欧美一区二区三区 | 2019年国产高清情侣视频 |