亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中asyncio模塊使用詳解

 更新時間:2024年10月14日 08:52:34   作者:zhangpaopao0609  
Python中的asyncio模塊提供了異步IO支持,通過協(xié)程和事件循環(huán)實現(xiàn)異步編程,使用裝飾器@asyncio.coroutine可以定義協(xié)程,yield from語法用于調(diào)用其他協(xié)程并實現(xiàn)非阻塞等待,asyncio.sleep()模擬IO操作,通過并發(fā)執(zhí)行多個協(xié)程提高程序性能

概述

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

asyncio 的編程模型就是一個消息循環(huán)。

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

用asyncio實現(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í)行下一行語句。

把asyncio.sleep(2)看成是一個耗時2秒的IO操作(比如讀取大文件),在此期間,主線程并未等待,而是去執(zhí)行 EventLoop 中其他可以執(zhí)行的 coroutine 了,因此可以實現(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ā)完成。

總結(jié)

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

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

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

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • PyCharm最新激活碼(2020/10/27全網(wǎng)最新)

    PyCharm最新激活碼(2020/10/27全網(wǎng)最新)

    Pycharm最新激活碼全網(wǎng)最新(2020/10/27更新),適用Intellij idea 2020.2.x,WebStorm 2020.2.x,Pycharm 2020.2.x
    2020-10-10
  • Python進(jìn)行指數(shù)和對數(shù)曲線擬合詳解

    Python進(jìn)行指數(shù)和對數(shù)曲線擬合詳解

    曲線擬合是構(gòu)造曲線或數(shù)學(xué)函數(shù)的過程,其具有對一系列數(shù)據(jù)點的最佳擬合,可能受到約束,本文主要介紹了如何使用Python實現(xiàn)指數(shù)和對數(shù)曲線擬合,需要的可以參考下
    2024-04-04
  • python 日志增量抓取實現(xiàn)方法

    python 日志增量抓取實現(xiàn)方法

    下面小編就為大家分享一篇python 日志增量抓取實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python利用py-redis實現(xiàn)分布式鎖

    Python利用py-redis實現(xiàn)分布式鎖

    隨著業(yè)務(wù)的增長,后端技術(shù)架構(gòu)會慢慢的從單體服務(wù)轉(zhuǎn)向多服務(wù)或者微服務(wù)的分布式架構(gòu),本文主要為大家介紹了如何利用Py-Redis實現(xiàn)簡單的分布式鎖,需要的可以參考一下
    2023-08-08
  • python 用opencv實現(xiàn)霍夫線變換

    python 用opencv實現(xiàn)霍夫線變換

    這篇文章主要介紹了python 如何用opencv實現(xiàn)霍夫線變換,幫助大家更好的理解和使用python處理圖片,感興趣的朋友可以了解下
    2020-11-11
  • python實現(xiàn)錄屏功能(親測好用)

    python實現(xiàn)錄屏功能(親測好用)

    這篇文章主要介紹了使python實現(xiàn)錄屏功能(親測好用),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的工作或?qū)W習(xí)具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • python 判斷參數(shù)為Nonetype類型或空的實例

    python 判斷參數(shù)為Nonetype類型或空的實例

    今天小編就為大家分享一篇python 判斷參數(shù)為Nonetype類型或空的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 使用numpy轉(zhuǎn)換成cupy利用GPU執(zhí)行錯誤

    使用numpy轉(zhuǎn)換成cupy利用GPU執(zhí)行錯誤

    在使用PyInstaller打包Python程序時,可能會遇到缺少模塊的錯誤,尤其是在將Numpy轉(zhuǎn)換為CuPy以利用GPU加速時,如果遇到ModuleNotFoundError,表明PyInstaller沒有包含一些隱式導(dǎo)入的包,解決方法是手動將缺失的包添加到打包目錄中
    2024-09-09
  • Python3編程實現(xiàn)獲取阿里云ECS實例及監(jiān)控的方法

    Python3編程實現(xiàn)獲取阿里云ECS實例及監(jiān)控的方法

    這篇文章主要介紹了Python3編程實現(xiàn)獲取阿里云ECS實例及監(jiān)控的方法,涉及Python URL登陸及請求處理相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 使用Python對Dicom文件進(jìn)行讀取與寫入的實現(xiàn)

    使用Python對Dicom文件進(jìn)行讀取與寫入的實現(xiàn)

    這篇文章主要介紹了使用Python對Dicom文件進(jìn)行讀取與寫入的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論