最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中asyncio模塊的深入講解

 更新時(shí)間:2019年06月10日 08:40:37   作者:且聽風(fēng)吟  
這篇文章主要給大家介紹了關(guān)于Python中asyncio模塊的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

1. 概述

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

asyncio 的編程模型就是一個(gè)消息循環(huán)。我們從 asyncio 塊中直接獲取一個(gè) 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 把一個(gè) generator 標(biāo)記為 coroutine 類型,然后,我們就把這個(gè) coroutine 扔到 EventLoop 中執(zhí)行。

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

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

我們用task封裝兩個(gè)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)前線程名稱可以看出,兩個(gè) coroutine 是由同一個(gè)線程并發(fā)執(zhí)行的。

如果把 asyncio.sleep() 換成真正的IO操作,則多個(gè) coroutine 就可以由一個(gè)線程并發(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...
(等待一段時(shí)間)
(打印出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個(gè)連接由一個(gè)線程通過coroutine并發(fā)完成。

3. 小結(jié)

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

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

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

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

相關(guān)文章

  • Python制作Windows按鍵通知腳本

    Python制作Windows按鍵通知腳本

    對(duì)于鍵盤沒有背光燈的同學(xué)而言,切換大小寫或控制Num鍵開關(guān)的時(shí)候沒有提示,經(jīng)常需要試探性地輸入一些字符來判斷開關(guān)是否打開,體驗(yàn)非常糟糕。所以本文就來用Python做一個(gè)Windows按鍵通知腳本,需要的可以參考一下
    2022-11-11
  • 15行Python代碼實(shí)現(xiàn)網(wǎng)易云熱門歌單實(shí)例教程

    15行Python代碼實(shí)現(xiàn)網(wǎng)易云熱門歌單實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于利用15行Python代碼實(shí)現(xiàn)網(wǎng)易云熱門歌單的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 利用Python求陰影部分的面積實(shí)例代碼

    利用Python求陰影部分的面積實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于利用Python求陰影部分面積的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Python字符串格式化str.format()方法的實(shí)現(xiàn)

    Python字符串格式化str.format()方法的實(shí)現(xiàn)

    字符串的格式化是一個(gè)非常重要的功能,用于創(chuàng)建包含變量值的字符串,本來就來介紹一下Python字符串格式化str.format()方法的實(shí)現(xiàn),感興趣的可以了解一下
    2023-11-11
  • Python Tornado框架輕松寫一個(gè)Web應(yīng)用的全過程

    Python Tornado框架輕松寫一個(gè)Web應(yīng)用的全過程

    Tornado全稱Tornado Web Server,是一個(gè)用Python語言寫成的Web服務(wù)器兼Web應(yīng)用框架,Tornado走的是少而精的方向,注重的是性能優(yōu)越,它最出名的是異步非阻塞的服務(wù)器方式,這篇文章主要給大家介紹了關(guān)于Python Tornado框架輕松寫一個(gè)Web應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • python3讀取excel文件只提取某些行某些列的值方法

    python3讀取excel文件只提取某些行某些列的值方法

    今天小編就為大家分享一篇python3讀取excel文件只提取某些行某些列的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python?sklearn轉(zhuǎn)換器估計(jì)器和K-近鄰算法

    Python?sklearn轉(zhuǎn)換器估計(jì)器和K-近鄰算法

    這篇文章主要介紹了Python?sklearn轉(zhuǎn)換器估計(jì)器和K-近鄰算法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Python自動(dòng)化提取多個(gè)Word文檔的文本

    Python自動(dòng)化提取多個(gè)Word文檔的文本

    在日常工作和學(xué)習(xí)中,我們經(jīng)常需要處理大量的Word文檔,本文將深入探討如何利用Python批量提取Word文檔中的文本內(nèi)容,幫助你解放生產(chǎn)力,感興趣的小伙伴可以了解下
    2025-12-12
  • Python圖像處理之使用OpenCV檢測(cè)對(duì)象顏色

    Python圖像處理之使用OpenCV檢測(cè)對(duì)象顏色

    OpenCV顏色檢測(cè)只是一個(gè)起點(diǎn),最終目標(biāo)是最終使用Python?3代碼在視頻流幀中定位彩色元素位置,下面這篇文章主要給大家介紹了關(guān)于Python圖像處理之使用OpenCV檢測(cè)對(duì)象顏色的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Python爬蟲實(shí)現(xiàn)自動(dòng)登錄、簽到功能的代碼

    Python爬蟲實(shí)現(xiàn)自動(dòng)登錄、簽到功能的代碼

    這篇文章主要介紹了Python爬蟲實(shí)現(xiàn)自動(dòng)登錄、簽到功能的代碼,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論

乌兰察布市| 阜新| 隆德县| 房产| 荆门市| 澳门| 沙河市| 泗水县| 黔西县| 衡阳县| 建湖县| 上栗县| 山东| 承德县| 家居| 石屏县| 榆社县| 日照市| 桑植县| 安多县| 渭南市| 延津县| 珠海市| 万源市| 恩施市| 太原市| 洪泽县| 乌鲁木齐县| 开阳县| 邵阳县| 仲巴县| 翁牛特旗| 沧源| 庆云县| 张北县| 茶陵县| 德令哈市| 明光市| 桂林市| 轮台县| 滦平县|