国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深入理解Python協(xié)程:從基礎(chǔ)到實(shí)戰(zhàn)

這篇具有很好參考價(jià)值的文章主要介紹了深入理解Python協(xié)程:從基礎(chǔ)到實(shí)戰(zhàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


title: 深入理解Python協(xié)程:從基礎(chǔ)到實(shí)戰(zhàn)
date: 2024/4/27 16:48:43
updated: 2024/4/27 16:48:43
categories:

  • 后端開發(fā)

tags:

  • 協(xié)程
  • 異步IO
  • 并發(fā)編程
  • Python
  • aiohttp
  • asyncio
  • 網(wǎng)絡(luò)爬蟲

深入理解Python協(xié)程:從基礎(chǔ)到實(shí)戰(zhàn)
深入理解Python協(xié)程:從基礎(chǔ)到實(shí)戰(zhàn)

第1章:協(xié)程基礎(chǔ)

1.1 協(xié)程概念介紹

協(xié)程(Coroutines)是一種特殊的軟件構(gòu)造,它允許程序在執(zhí)行過程中暫停并恢復(fù)執(zhí)行,而不會(huì)丟失當(dāng)前的執(zhí)行上下文。與線程和進(jìn)程不同,協(xié)程在單個(gè)線程中運(yùn)行,通過調(diào)度機(jī)制實(shí)現(xiàn)并發(fā),降低了上下文切換的開銷,提高了程序的執(zhí)行效率。協(xié)程通常用于處理I/O密集型任務(wù),如網(wǎng)絡(luò)請(qǐng)求、文件讀寫等。

1.2 生成器與yield的原理

生成器(Generators)是Python中實(shí)現(xiàn)協(xié)程的一種方式,它通過內(nèi)置的yield關(guān)鍵字來暫停和恢復(fù)執(zhí)行。當(dāng)函數(shù)遇到yield
時(shí),會(huì)暫停執(zhí)行并返回一個(gè)值,下次調(diào)用時(shí)會(huì)從上次暫停的地方繼續(xù)執(zhí)行。yield
實(shí)際上是一個(gè)特殊的return語(yǔ)句,它會(huì)保存當(dāng)前的狀態(tài)(包括局部變量和執(zhí)行上下文),當(dāng)再次調(diào)用時(shí),這些狀態(tài)會(huì)被恢復(fù)。

def coroutine_example():
    value = yield 0
    print(f'Received value: {value}')
    value = yield 1
    print(f'Received value: {value}')


c = coroutine_example()
next(c)  # 輸出 'Received value: 0'
print(c.send(2))  # 輸出 'Received value: 1'

1.3 協(xié)程與多線程/多進(jìn)程的區(qū)別

  • 多線程:線程是操作系統(tǒng)層面的并行執(zhí)行單位,線程間通信需要鎖等同步機(jī)制,上下文切換開銷大,適合CPU密集型任務(wù)。
  • 多進(jìn)程:進(jìn)程是獨(dú)立的執(zhí)行環(huán)境,擁有自己的內(nèi)存空間,適合I/O密集型任務(wù),但創(chuàng)建和銷毀進(jìn)程開銷大。
  • 協(xié)程:協(xié)程在單線程中通過控制流切換實(shí)現(xiàn)并發(fā),沒有線程切換開銷,但資源占用相對(duì)較少,適合I/O等待任務(wù)。

1.4 協(xié)程的生命周期與狀態(tài)轉(zhuǎn)換

  • 創(chuàng)建:函數(shù)定義為生成器,使用yield關(guān)鍵字。
  • 啟動(dòng):通過調(diào)用生成器實(shí)例的next()send()方法開始執(zhí)行,直到遇到yield
  • 暫停:遇到yield時(shí),函數(shù)暫停,保存當(dāng)前狀態(tài)。
  • 恢復(fù):通過send()方法傳入值,函數(shù)從上次暫停的地方繼續(xù)執(zhí)行。
  • 結(jié)束:當(dāng)沒有更多yield可執(zhí)行,或遇到return語(yǔ)句時(shí),協(xié)程結(jié)束。

第2章:協(xié)程實(shí)踐基礎(chǔ)

2.1 使用asyncio庫(kù)

asyncio是 Python 中用于編寫異步代碼的標(biāo)準(zhǔn)庫(kù),它提供了一組工具和API來管理和調(diào)度協(xié)程。通過asyncio,可以輕松創(chuàng)建、執(zhí)行和管理異步任務(wù)。

import asyncio


async def async_function():
    await asyncio.sleep(1)
    print("Async function executed")


asyncio.run(async_function())

2.2 異步函數(shù)與async/await

async關(guān)鍵字用于定義異步函數(shù),await關(guān)鍵字用于暫停異步函數(shù)的執(zhí)行,等待另一個(gè)異步任務(wù)完成。

import asyncio


async def async_function():
    await asyncio.sleep(1)
    print("Async function executed")


asyncio.run(async_function())

2.3 協(xié)程的調(diào)度與調(diào)度器

asyncio提供了事件循環(huán)(Event Loop)來調(diào)度協(xié)程的執(zhí)行。事件循環(huán)負(fù)責(zé)管理和調(diào)度所有的協(xié)程任務(wù),確保它們按照正確的順序執(zhí)行。

import asyncio


async def task():
    print("Task executed")


async def main():
    await asyncio.gather(task(), task())


asyncio.run(main())

2.4 示例:網(wǎng)絡(luò)請(qǐng)求的異步處理

import asyncio
import aiohttp


async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()


async def main():
    urls = ['http://example.com', 'http://example.org']
    tasks = [fetch(url) for url in urls]
    responses = await asyncio.gather(*tasks)
    for response in responses:
        print(response)


asyncio.run(main())

這個(gè)例子演示了如何使用asyncioaiohttp庫(kù)進(jìn)行異步的網(wǎng)絡(luò)請(qǐng)求處理。fetch()函數(shù)負(fù)責(zé)發(fā)送 HTTP
請(qǐng)求并返回響應(yīng)內(nèi)容,main()函數(shù)創(chuàng)建了多個(gè)任務(wù),并使用asyncio.gather()并行執(zhí)行這些任務(wù),最后輸出每個(gè)請(qǐng)求的響應(yīng)內(nèi)容。

第3章:協(xié)程的高級(jí)應(yīng)用

異步并發(fā)編程的基本概念

1. 異步編程的概念和優(yōu)勢(shì)

異步編程是一種編程范式,允許程序在等待某些操作完成的同時(shí)繼續(xù)執(zhí)行其他任務(wù),而不會(huì)被阻塞。相比于傳統(tǒng)的同步編程方式,異步編程具有以下優(yōu)勢(shì):

  • 提高程序性能:異步編程可以充分利用計(jì)算資源,減少等待時(shí)間,從而提高程序的響應(yīng)速度和并發(fā)處理能力。
  • 提升用戶體驗(yàn):在I/O密集型任務(wù)中,異步編程可以使程序在等待I/O操作完成時(shí)繼續(xù)執(zhí)行其他任務(wù),提升用戶體驗(yàn)。
  • 簡(jiǎn)化編程模型:通過異步編程,可以避免復(fù)雜的回調(diào)嵌套,提高代碼的可讀性和維護(hù)性。

2. 協(xié)程是如何實(shí)現(xiàn)異步編程的關(guān)鍵技術(shù)

協(xié)程是一種輕量級(jí)的線程,可以在執(zhí)行過程中暫停并恢復(fù)。在Python中,協(xié)程通過asyncawait
關(guān)鍵字實(shí)現(xiàn),是異步編程的關(guān)鍵技術(shù)之一。協(xié)程的實(shí)現(xiàn)原理包括以下幾個(gè)關(guān)鍵點(diǎn):

  • 異步函數(shù)定義:使用async def定義的函數(shù)可以在函數(shù)內(nèi)部使用await關(guān)鍵字來掛起函數(shù)的執(zhí)行,等待異步操作完成。
  • 事件循環(huán):異步編程通常需要一個(gè)事件循環(huán)來調(diào)度協(xié)程的執(zhí)行,Python中的asyncio庫(kù)提供了事件循環(huán)的支持。
  • 協(xié)程調(diào)度:事件循環(huán)會(huì)根據(jù)協(xié)程的狀態(tài)和優(yōu)先級(jí)調(diào)度協(xié)程的執(zhí)行,使得程序能夠在不同的協(xié)程之間切換執(zhí)行,實(shí)現(xiàn)異步編程的效果。

3. 異步事件循環(huán)與任務(wù)池

1. 異步事件循環(huán)的原理和作用

異步事件循環(huán)是異步編程中的核心概念,負(fù)責(zé)協(xié)調(diào)和調(diào)度異步任務(wù)的執(zhí)行。其原理包括以下幾個(gè)關(guān)鍵點(diǎn):

  • 事件循環(huán):異步事件循環(huán)通過不斷循環(huán)檢查事件隊(duì)列中的任務(wù),根據(jù)任務(wù)的狀態(tài)和優(yōu)先級(jí)來調(diào)度任務(wù)的執(zhí)行。
  • 任務(wù)調(diào)度:事件循環(huán)會(huì)根據(jù)任務(wù)的狀態(tài)(掛起、就緒、運(yùn)行)和優(yōu)先級(jí)來決定任務(wù)的執(zhí)行順序,以實(shí)現(xiàn)異步編程的效果。
  • 掛起和恢復(fù):事件循環(huán)能夠在任務(wù)需要等待I/O操作完成時(shí)掛起任務(wù),等待事件發(fā)生后再恢復(fù)任務(wù)的執(zhí)行。

異步事件循環(huán)的作用在于提供一個(gè)統(tǒng)一的調(diào)度器,使得異步任務(wù)能夠在不同的協(xié)程之間切換執(zhí)行,實(shí)現(xiàn)非阻塞的并發(fā)處理。

2. 任務(wù)池在異步編程中的重要性

任務(wù)池是一種管理和調(diào)度異步任務(wù)的機(jī)制,用于管理大量的異步任務(wù)并控制其并發(fā)執(zhí)行。任務(wù)池在異步編程中具有以下重要性:

  • 控制并發(fā)度:任務(wù)池可以限制同時(shí)執(zhí)行的任務(wù)數(shù)量,避免系統(tǒng)資源被過度占用,提高程序的穩(wěn)定性和性能。
  • 任務(wù)調(diào)度:任務(wù)池可以根據(jù)任務(wù)的優(yōu)先級(jí)和狀態(tài)來調(diào)度任務(wù)的執(zhí)行順序,確保任務(wù)按照預(yù)期的順序執(zhí)行。
  • 異常處理:任務(wù)池可以捕獲和處理任務(wù)執(zhí)行過程中的異常,避免異常導(dǎo)致整個(gè)程序崩潰。

任務(wù)池在異步編程中扮演著重要的角色,能夠有效管理和調(diào)度大量的異步任務(wù),提高程序的效率和可靠性。

3. 示例:使用asyncio庫(kù)創(chuàng)建和管理任務(wù)集合

下面是一個(gè)簡(jiǎn)單的示例,演示如何使用asyncio庫(kù)創(chuàng)建和管理任務(wù)集合:

import asyncio


async def task(num):
    print(f"Task {num} started")
    await asyncio.sleep(1)
    print(f"Task {num} completed")


async def main():
    tasks = [task(i) for i in range(3)]  # 創(chuàng)建多個(gè)任務(wù)
    await asyncio.gather(*tasks)  # 等待所有任務(wù)完成


if __name__ == "__main__":
    asyncio.run(main())  # 運(yùn)行主函數(shù)

在這個(gè)示例中,我們定義了一個(gè)異步任務(wù)task,然后在main函數(shù)中創(chuàng)建了多個(gè)任務(wù),并使用asyncio.gather
來等待所有任務(wù)完成。最后通過asyncio.run來運(yùn)行主函數(shù)。這樣就實(shí)現(xiàn)了使用asyncio庫(kù)創(chuàng)建和管理任務(wù)集合的功能。

協(xié)程池與資源管理

1. 協(xié)程池在并發(fā)編程中的作用和優(yōu)化策略

協(xié)程池是一種用于管理和調(diào)度協(xié)程執(zhí)行的機(jī)制,可以控制并發(fā)度、減少資源占用和提高程序性能。協(xié)程池在并發(fā)編程中的作用和優(yōu)化策略包括:

  • 控制并發(fā)度:協(xié)程池可以限制同時(shí)執(zhí)行的協(xié)程數(shù)量,避免資源過度占用,提高程序的穩(wěn)定性。
  • 復(fù)用資源:協(xié)程池可以復(fù)用已經(jīng)創(chuàng)建的協(xié)程,減少頻繁創(chuàng)建和銷毀協(xié)程的開銷,提高程序的效率。
  • 調(diào)度協(xié)程:協(xié)程池可以根據(jù)任務(wù)的狀態(tài)和優(yōu)先級(jí)來調(diào)度協(xié)程的執(zhí)行順序,確保任務(wù)按照預(yù)期的順序執(zhí)行。
  • 優(yōu)化性能:通過合理配置協(xié)程池的大小和參數(shù),可以優(yōu)化程序的性能,提高并發(fā)處理能力。

優(yōu)化策略包括合理設(shè)置協(xié)程池的大小、避免阻塞操作、及時(shí)處理協(xié)程的返回值等,以提高程序的效率和性能。

2. 資源管理的重要性和如何避免資源泄露

資源管理在并發(fā)編程中非常重要,可以避免資源泄露和提高程序的穩(wěn)定性。避免資源泄露的方法包括:

  • 使用上下文管理器:對(duì)于文件、網(wǎng)絡(luò)連接等資源,使用with語(yǔ)句可以確保資源在使用完畢后及時(shí)釋放。
  • 手動(dòng)釋放資源:對(duì)于一些需要手動(dòng)釋放的資源,如內(nèi)存、數(shù)據(jù)庫(kù)連接等,及時(shí)調(diào)用相應(yīng)的釋放資源的方法。
  • 避免循環(huán)引用:在異步編程中,避免循環(huán)引用導(dǎo)致資源無法釋放,可以使用弱引用等方式來處理。

良好的資源管理能夠避免資源泄露和提高程序的穩(wěn)定性,確保程序的正常運(yùn)行。

3. 如何有效管理協(xié)程的取消和異常處理

在異步編程中,管理協(xié)程的取消和異常處理是非常重要的,可以提高程序的健壯性。有效管理協(xié)程的取消和異常處理包括:

  • 取消協(xié)程:使用asyncio.Task.cancel()方法可以取消正在執(zhí)行的協(xié)程,避免不必要的資源消耗。
  • 異常處理:在協(xié)程中使用try-except語(yǔ)句捕獲異常,并根據(jù)實(shí)際情況處理異常,避免程序崩潰。
  • 統(tǒng)一異常處理:可以使用asyncio.create_task()創(chuàng)建任務(wù),并在任務(wù)中統(tǒng)一處理異常,以確保程序的穩(wěn)定性。

通過合理取消協(xié)程和處理異常,可以有效管理協(xié)程的執(zhí)行過程,提高程序的可靠性和健壯性。

示例:使用協(xié)程實(shí)現(xiàn)高效的Web服務(wù)器

1. 異步編程提高性能

異步編程在Web服務(wù)器中的應(yīng)用可以顯著提高性能,因?yàn)樗试S服務(wù)器在等待客戶端響應(yīng)時(shí)處理其他請(qǐng)求,而不是阻塞。這種方式提高了服務(wù)器的并發(fā)處理能力,使得在高負(fù)載情況下也能保持良好的響應(yīng)速度。

2. 使用aiohttp構(gòu)建異步Web服務(wù)器

aiohttp是一個(gè)用于構(gòu)建高性能HTTP/HTTPS服務(wù)器和客戶端的Python庫(kù),它非常適合異步IO操作。下面是一個(gè)簡(jiǎn)單的aiohttp異步Web服務(wù)器示例:

import asyncio
from aiohttp import web

runner = None  # 定義全局變量 runner


async def handle_request(request):
    name = request.match_info.get('name', 'World')
    text = f'Hello, {name}!'
    return web.Response(text=text)


async def run_app(app):
    global runner  # 聲明使用全局變量 runner
    runner = web.AppRunner(app)
    await runner.setup()
    site = web.TCPSite(runner, '127.0.0.1', 8080)
    await site.start()


async def main():
    app = web.Application()
    app.router.add_get('/{name}', handle_request)

    try:
        print('Server started at http://127.0.0.1:8080')
        await run_app(app)
    except KeyboardInterrupt:
        pass
    finally:
        if runner is not None:  # 檢查 runner 是否已初始化
            await runner.cleanup()  # 使用 runner.cleanup() 替代 runner.shutdown()


if __name__ == '__main__':
    asyncio.run(main())  # 使用 asyncio.run() 簡(jiǎn)化事件循環(huán)管理

在這個(gè)例子中,handle_request函數(shù)是協(xié)程,它接收一個(gè)請(qǐng)求,處理并返回響應(yīng)。app()函數(shù)創(chuàng)建了一個(gè)應(yīng)用實(shí)例,添加路由,并啟動(dòng)一個(gè)事件循環(huán)來監(jiān)聽請(qǐng)求。

3. 異步請(qǐng)求處理、事件循環(huán)和任務(wù)池的協(xié)作

  • 異步請(qǐng)求處理:aiohttp的web.Request對(duì)象和web.View接口都是異步的,通過async def定義的函數(shù)處理請(qǐng)求,可以在處理過程中執(zhí)行其他協(xié)程,提高效率。
  • 事件循環(huán)asyncio.get_event_loop()獲取事件循環(huán),它負(fù)責(zé)調(diào)度協(xié)程的執(zhí)行,當(dāng)有新的請(qǐng)求到達(dá)時(shí),它會(huì)將請(qǐng)求添加到任務(wù)隊(duì)列中,等待調(diào)度。
  • 任務(wù)池:雖然aiohttp沒有直接提供任務(wù)池,但事件循環(huán)本質(zhì)上就是一個(gè)任務(wù)池,它可以同時(shí)執(zhí)行多個(gè)協(xié)程,直到事件循環(huán)結(jié)束或有新的任務(wù)加入。

通過這種方式,aiohttp可以實(shí)現(xiàn)高效的Web服務(wù)器,提高并發(fā)處理能力,同時(shí)避免了阻塞,使得服務(wù)器在高負(fù)載下仍能保持良好的性能。

第4章:協(xié)程與異步IO

4.1 文件操作與Socket編程的異步處理

在異步IO中,文件操作和Socket編程是常見的任務(wù),可以通過協(xié)程實(shí)現(xiàn)異步處理以提高效率。

文件操作的異步處理:
import asyncio


async def read_file_async(file_path):
    async with open(file_path, 'r') as file:
        data = await file.read()
        return data


async def write_file_async(file_path, data):
    async with open(file_path, 'w') as file:
        await file.write(data)


# 使用示例
async def main():
    data = await read_file_async('example.txt')
    await write_file_async('example_copy.txt', data)


asyncio.run(main())
Socket編程的異步處理:
import asyncio


async def handle_client(reader, writer):
    data = await reader.read(100)
    message = data.decode()
    addr = writer.get_extra_info('peername')
    print(f"Received {message} from {addr}")

    print(f"Send: {message}")
    writer.write(data)
    await writer.drain()

    print("Closing the connection")
    writer.close()


async def main():
    server = await asyncio.start_server(
        handle_client, '127.0.0.1', 8888)

    addr = server.sockets[0].getsockname()
    print(f'Serving on {addr}')

    async with server:
        await server.serve_forever()


asyncio.run(main())

4.2 數(shù)據(jù)庫(kù)操作的異步編程

數(shù)據(jù)庫(kù)操作通常涉及磁盤IO和網(wǎng)絡(luò)IO,因此異步編程在此領(lǐng)域尤為重要。常見的數(shù)據(jù)庫(kù)操作庫(kù)如asyncpg、aiomysql等都提供了異步接口。

import asyncio
import asyncpg


async def fetch_data():
    conn = await asyncpg.connect(user='user', password='password',
                                 database='database', host='127.0.0.1')
    values = await conn.fetch('''SELECT * FROM table''')
    await conn.close()
    return values


async def main():
    data = await fetch_data()
    print(data)


asyncio.run(main())

4.3 示例:異步數(shù)據(jù)庫(kù)操作與文件讀寫

import asyncio
import asyncpg


async def fetch_data_and_write_to_file():
    conn = await asyncpg.connect(user='user', password='password',
                                 database='database', host='127.0.0.1')
    values = await conn.fetch('''SELECT * FROM table''')
    await conn.close()

    async with open('database_data.txt', 'w') as file:
        for row in values:
            file.write(str(row) + '\n')


async def main():
    await fetch_data_and_write_to_file()


asyncio.run(main())

在這個(gè)示例中,我們連接到數(shù)據(jù)庫(kù),從表中檢索數(shù)據(jù),然后將數(shù)據(jù)寫入到文件中。所有這些操作都是異步的,通過協(xié)程實(shí)現(xiàn)了非阻塞的數(shù)據(jù)庫(kù)操作和文件IO。

第5章:協(xié)程與并發(fā)控制

5.1 鎖與同步原語(yǔ)在協(xié)程中的應(yīng)用

在協(xié)程中,為了避免并發(fā)訪問共享資源時(shí)出現(xiàn)數(shù)據(jù)競(jìng)爭(zhēng)的情況,可以使用鎖(Lock)等同步原語(yǔ)來實(shí)現(xiàn)線程間的互斥。

import asyncio


async def task(lock):
    async with lock:
        # 訪問共享資源的代碼
        print("Accessing shared resource")
        await asyncio.sleep(1)
        print("Finished accessing shared resource")


async def main():
    lock = asyncio.Lock()
    tasks = [task(lock) for _ in range(5)]
    await asyncio.gather(*tasks)


asyncio.run(main())

在上面的示例中,通過asyncio.Lock()創(chuàng)建了一個(gè)鎖對(duì)象,然后在協(xié)程中使用async with lock來獲取鎖。這樣可以保證同一時(shí)刻只有一個(gè)協(xié)程可以訪問共享資源。

5.2 指針鎖與asyncio的解決方案

在Python的asyncio模塊中,并發(fā)控制通常通過asyncio.Lock來實(shí)現(xiàn),而不是使用傳統(tǒng)的指針鎖。asyncio.Lock
是基于協(xié)程的鎖,可以在協(xié)程中使用async with lock語(yǔ)法來實(shí)現(xiàn)鎖定和釋放。

import asyncio


async def task(lock):
    async with lock:
        # 訪問共享資源的代碼
        print("Accessing shared resource")
        await asyncio.sleep(1)
        print("Finished accessing shared resource")


async def main():
    lock = asyncio.Lock()
    tasks = [task(lock) for _ in range(5)]
    await asyncio.gather(*tasks)


asyncio.run(main())

5.3 示例:并發(fā)訪問共享資源的管理

import asyncio

shared_resource = 0
lock = asyncio.Lock()


async def update_shared_resource():
    global shared_resource
    async with lock:
        shared_resource += 1


async def main():
    tasks = [update_shared_resource() for _ in range(10)]
    await asyncio.gather(*tasks)
    print(f"Final shared resource value: {shared_resource}")


asyncio.run(main())

在這個(gè)示例中,多個(gè)協(xié)程同時(shí)更新共享資源shared_resource,通過asyncio.Lock實(shí)現(xiàn)并發(fā)控制,確保共享資源的安全訪問。最終輸出的共享資源值應(yīng)為10,每個(gè)協(xié)程更新一次。

第6章:協(xié)程的并發(fā)編程模式

6.1 協(xié)程鏈與流水線模式

協(xié)程鏈(Coroutine
Chain)是一種將多個(gè)協(xié)程按照順序連接起來的并發(fā)編程模式,每個(gè)協(xié)程負(fù)責(zé)處理一部分任務(wù)。流水線模式(Pipeline)是協(xié)程鏈的一種特例,它將數(shù)據(jù)流通過一系列協(xié)程進(jìn)行處理,每個(gè)協(xié)程只負(fù)責(zé)處理特定的數(shù)據(jù)處理步驟。

import asyncio


async def coroutine1(data):
    # 處理數(shù)據(jù)
    print(f"Coroutinue1: {data}")
    await asyncio.sleep(0.1)
    return data * 2


async def coroutine2(data):
    # 處理數(shù)據(jù)
    print(f"Coroutinue2: {data}")
    await asyncio.sleep(0.1)
    return data ** 2


async def main():
    data = 1
    coroutines = [coroutine1, coroutine2]
    for coroutine in coroutines:
        data = await coroutine(data)
    print(f"Final result: {data}")


asyncio.run(main())

在上面的示例中,我們創(chuàng)建了兩個(gè)協(xié)程coroutine1coroutine2,將它們按照順序連接起來,形成一個(gè)協(xié)程鏈。數(shù)據(jù)在協(xié)程鏈中流動(dòng),每個(gè)協(xié)程負(fù)責(zé)處理特定的數(shù)據(jù)處理步驟。

6.2 基于協(xié)程的事件驅(qū)動(dòng)架構(gòu)

事件驅(qū)動(dòng)架構(gòu)(Event-Driven Architecture)是一種基于事件的并發(fā)編程模式,它將應(yīng)用程序分解為多個(gè)獨(dú)立的事件處理器,每個(gè)事件處理器負(fù)責(zé)處理特定的事件。當(dāng)事件發(fā)生時(shí),事件處理器會(huì)被激活并執(zhí)行相應(yīng)的處理邏輯。

import asyncio


async def handle_event(event):
    # 處理事件
    print(f"Handling event: {event}")
    await asyncio.sleep(0.1)


async def main():
    events = ["event1", "event2", "event3"]
    tasks = [handle_event(event) for event in events]
    await asyncio.gather(*tasks)


asyncio.run(main())

在上面的示例中,我們定義了一個(gè)handle_event協(xié)程來處理事件。在main函數(shù)中,我們創(chuàng)建了三個(gè)事件event1event2event3
,然后為每個(gè)事件創(chuàng)建一個(gè)任務(wù),并使用asyncio.gather同時(shí)運(yùn)行這些任務(wù)。這樣,基于協(xié)程的事件驅(qū)動(dòng)架構(gòu)可以實(shí)現(xiàn)并發(fā)處理多個(gè)事件。

6.3 示例:基于協(xié)程的實(shí)時(shí)數(shù)據(jù)處理

基于協(xié)程的實(shí)時(shí)數(shù)據(jù)處理是一種利用協(xié)程實(shí)現(xiàn)數(shù)據(jù)流處理的并發(fā)編程模式,可以實(shí)現(xiàn)高效的數(shù)據(jù)處理和實(shí)時(shí)響應(yīng)。

import asyncio


async def process_data(data):
    # 處理數(shù)據(jù)
    print(f"Processing data: {data}")
    await asyncio.sleep(0.1)
    return data.upper()


async def main():
    data_stream = ["data1", "data2", "data3"]
    tasks = [process_data(data) for data in data_stream]
    processed_data = await asyncio.gather(*tasks)
    print(f"Processed data: {processed_data}")


asyncio.run(main())

在上面的示例中,我們定義了一個(gè)process_data協(xié)程來處理數(shù)據(jù)。在main函數(shù)中,我們創(chuàng)建了一個(gè)數(shù)據(jù)流data_stream
,并為每個(gè)數(shù)據(jù)創(chuàng)建一個(gè)處理任務(wù)。使用asyncio.gather可以同時(shí)運(yùn)行這些處理任務(wù),并等待它們完成。最終,我們可以得到處理后的數(shù)據(jù)流。

第7章:實(shí)戰(zhàn)項(xiàng)目:網(wǎng)絡(luò)爬蟲與Web應(yīng)用

7.1 爬蟲中的協(xié)程調(diào)度

在爬蟲中使用協(xié)程可以提高爬取效率,協(xié)程調(diào)度可以使爬蟲程序更加高效地處理多個(gè)任務(wù)。以下是一個(gè)簡(jiǎn)單的爬蟲示例,使用協(xié)程和異步IO庫(kù)aiohttp

import asyncio
import aiohttp


async def fetch_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()


async def main():
    urls = ["http://example.com/page1", "http://example.com/page2", "http://example.com/page3"]
    tasks = [fetch_url(url) for url in urls]
    results = await asyncio.gather(*tasks)
    for result in results:
        print(result)


asyncio.run(main())

在上面的示例中,我們定義了一個(gè)fetch_url協(xié)程來獲取URL的內(nèi)容。在main
函數(shù)中,我們創(chuàng)建了多個(gè)URL的任務(wù),并使用asyncio.gather同時(shí)運(yùn)行這些任務(wù)。這樣,爬蟲可以并發(fā)地獲取多個(gè)URL的內(nèi)容,提高爬取效率。

7.2 基于協(xié)程的Web服務(wù)器構(gòu)建

使用協(xié)程可以構(gòu)建高性能的Web服務(wù)器,以下是一個(gè)簡(jiǎn)單的基于協(xié)程的Web服務(wù)器示例:

from aiohttp import web


async def handle(request):
    return web.Response(text="Hello, World!")


app = web.Application()
app.router.add_get('/', handle)

web.run_app(app)

在上面的示例中,我們定義了一個(gè)處理函數(shù)handle來處理HTTP請(qǐng)求,并創(chuàng)建了一個(gè)web.Application應(yīng)用。通過app.router.add_get
將處理函數(shù)綁定到根路徑'/',最后使用web.run_app來運(yùn)行Web服務(wù)器。

7.3 實(shí)戰(zhàn)項(xiàng)目:構(gòu)建一個(gè)簡(jiǎn)單的異步HTTP客戶端

構(gòu)建一個(gè)簡(jiǎn)單的異步HTTP客戶端可以幫助我們實(shí)現(xiàn)高效的HTTP請(qǐng)求。以下是一個(gè)簡(jiǎn)單的異步HTTP客戶端示例:

import aiohttp
import asyncio


async def fetch_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()


async def main():
    url = "http://example.com"
    response = await fetch_url(url)
    print(response)


asyncio.run(main())

在上面的示例中,我們定義了一個(gè)fetch_url協(xié)程來獲取URL的內(nèi)容。在main函數(shù)中,我們發(fā)起了一個(gè)HTTP
GET請(qǐng)求,并等待響應(yīng)。這樣,我們可以實(shí)現(xiàn)異步地獲取URL的內(nèi)容。

第8章:協(xié)程的未來與展望

8.1 Python 3.7及以上版本的async/await改進(jìn)

Python 3.7版本及以上版本對(duì)async/await語(yǔ)法進(jìn)行了改進(jìn),使得使用協(xié)程更加方便和高效。以下是一些Python
3.7及以上版本中async/await語(yǔ)法的改進(jìn):

  • 支持async withasync for語(yǔ)句,使得使用協(xié)程可以更加方便和高效。
  • 支持async for語(yǔ)句的async for ... of語(yǔ)法,使得在協(xié)程中使用生成器更加簡(jiǎn)單和高效。
  • 支持async def語(yǔ)句,使得定義協(xié)程更加簡(jiǎn)單和直觀。
  • 支持await語(yǔ)句的await expression語(yǔ)法,使得在協(xié)程中等待異步操作更加簡(jiǎn)單和高效。
  • 支持asyncio庫(kù)中的asyncio.run函數(shù),使得運(yùn)行協(xié)程更加簡(jiǎn)單和高效。

8.2 協(xié)程在現(xiàn)代Python生態(tài)系統(tǒng)中的角色

在現(xiàn)代Python生態(tài)系ystem中,協(xié)程已經(jīng)成為一個(gè)非常重要的并發(fā)編程模型。以下是協(xié)程在現(xiàn)代Python生態(tài)系統(tǒng)中的一些角色:

  • 網(wǎng)絡(luò)爬蟲:使用協(xié)程可以實(shí)現(xiàn)高效的網(wǎng)絡(luò)爬蟲,提高爬取效率。
  • Web應(yīng)用:使用協(xié)程可以構(gòu)建高性能的Web應(yīng)用,提高響應(yīng)速度。
  • 異步IO:使用協(xié)程可以實(shí)現(xiàn)高效的異步IO操作,提高IO操作的效率。
  • 數(shù)據(jù)處理:使用協(xié)程可以實(shí)現(xiàn)高效的數(shù)據(jù)處理,提高數(shù)據(jù)處理的速度。
  • 分布式系統(tǒng):使用協(xié)程可以構(gòu)建高效的分布式系統(tǒng),提高系統(tǒng)的可擴(kuò)展性和可用性。

8.3 結(jié)語(yǔ)與進(jìn)一步學(xué)習(xí)資源

在本文中,我們介紹了協(xié)程的基本概念和使用方法,并結(jié)合實(shí)際案例展示了協(xié)程在實(shí)際應(yīng)用中的優(yōu)勢(shì)和應(yīng)用場(chǎng)景。如果您想進(jìn)一步學(xué)習(xí)協(xié)程,可以參考以下資源:

  • 《Python Cookbook》一書中的asyncioaiohttp章節(jié)。
  • 《Python 3.7 新特性與改進(jìn)》一文中的async/await章節(jié)。
  • 《Python 協(xié)程編程》一本電子書。
  • 《Python asyncio 編程》一本電子書。
  • Python官方文檔中的asyncio和aiohttp部分。

附錄

A. Python協(xié)程相關(guān)庫(kù)和工具介紹

首頁(yè) | 一個(gè)覆蓋廣泛主題工具的高效在線平臺(tái)(amd794.com)

asyncio

asyncio是Python 3.4版本引入的一個(gè)標(biāo)準(zhǔn)庫(kù),用于實(shí)現(xiàn)異步IO操作和并發(fā)編程。asyncio
基于協(xié)程實(shí)現(xiàn),提供了許多高級(jí)API和工具,使得開發(fā)人員可以快速構(gòu)建高效的異步IO應(yīng)用。

aiohttp

aiohttp是一個(gè)基于asyncio實(shí)現(xiàn)的異步HTTP客戶端和服務(wù)器庫(kù)。aiohttp支持協(xié)程,提供了許多高級(jí)API和工具,使得開發(fā)人員可以快速構(gòu)建高效的異步Web應(yīng)用。

trio

trio是一個(gè)基于協(xié)程實(shí)現(xiàn)的異步IO操作和并發(fā)編程庫(kù),與asyncio類似,但提供了更加簡(jiǎn)單和高效的API和工具。trio
支持多個(gè)事件循環(huán),可以更加靈活和高效地管理協(xié)程。

curio

curio是一個(gè)基于協(xié)程實(shí)現(xiàn)的異步IO操作和并發(fā)編程庫(kù),與asyncio類似,但提供了更加簡(jiǎn)單和高效的API和工具。curio
支持多個(gè)事件循環(huán),可以更加靈活和高效地管理協(xié)程。

Sanic

Sanic是一個(gè)基于aiohttp實(shí)現(xiàn)的異步Web框架,支持協(xié)程,提供了許多高級(jí)API和工具,使得開發(fā)人員可以快速構(gòu)建高效的異步Web應(yīng)用。

B. 協(xié)程調(diào)試與性能優(yōu)化

調(diào)試

調(diào)試協(xié)程可能會(huì)比調(diào)試同步代碼更加復(fù)雜,因?yàn)閰f(xié)程的執(zhí)行流程更加復(fù)雜。以下是一些調(diào)試協(xié)程的技巧和工具:

  • 使用pdb調(diào)試器:pdb是Python的標(biāo)準(zhǔn)調(diào)試器,可以用于調(diào)試協(xié)程。
  • 使用asyncio提供的asyncio.get_event_loop()函數(shù)獲取當(dāng)前事件循環(huán),并使用loop.run_until_complete()函數(shù)運(yùn)行協(xié)程。
  • 使用asyncio提供的asyncio.create_task()函數(shù)創(chuàng)建一個(gè)新的任務(wù),并使用asyncio.gather()函數(shù)等待所有任務(wù)完成。
  • 使用asyncio提供的asyncio.as_completed()函數(shù)按照完成順序獲取任務(wù)的結(jié)果。
  • 使用asyncio提供的asyncio.wait()函數(shù)等待所有任務(wù)完成,并獲取完成和未完成的任務(wù)列表。

性能優(yōu)化

優(yōu)化協(xié)程的性能可能會(huì)比優(yōu)化同步代碼更加復(fù)雜,因?yàn)閰f(xié)程的執(zhí)行流程更加復(fù)雜。以下是一些優(yōu)化協(xié)程性能的技巧和工具:

  • 使用asyncio.gather()函數(shù)并行執(zhí)行多個(gè)任務(wù),提高IO操作的效率。
  • 使用asyncio.sleep()函數(shù)減少CPU占用,提高IO操作的效率。
  • 使用asyncio.wait()函數(shù)并行執(zhí)行多個(gè)任務(wù),并獲取完成和未完成的任務(wù)列表,提高IO操作的效率。
  • 使用asyncio.as_completed()函數(shù)按照完成順序獲取任務(wù)的結(jié)果,提高IO操作的效率。
  • 使用asyncio.Queueasyncio.Semaphore限制并發(fā)數(shù),提高IO操作的效率。

C. 常見問題解答

1. 什么是協(xié)程?

協(xié)程是一種輕量級(jí)的線程,可以在單個(gè)線程中實(shí)現(xiàn)多個(gè)任務(wù)的并發(fā)執(zhí)行。

2. 為什么使用協(xié)程?

使用協(xié)程可以實(shí)現(xiàn)高效的異步IO操作和并發(fā)編程,提高IO操作的效率。

3. 如何使用協(xié)程?

使用協(xié)程需要使用asyncawait關(guān)鍵字,定義一個(gè)協(xié)程函數(shù),并使用asyncio庫(kù)中的asyncio.run()函數(shù)運(yùn)行協(xié)程。

4. 如何在協(xié)程中等待異步操作?

使用await關(guān)鍵字可以在協(xié)程中等待異步操作,直到操作完成。

5. 如何在協(xié)程中創(chuàng)建一個(gè)新的任務(wù)?

使用asyncio.create_task()函數(shù)可以在協(xié)程中創(chuàng)建一個(gè)新的任務(wù)。

6. 如何在協(xié)程中等待多個(gè)任務(wù)完成?

使用asyncio.gather()函數(shù)可以在協(xié)程中等待多個(gè)任務(wù)完成。

7. 如何在協(xié)程中獲取完成的任務(wù)結(jié)果?

使用asyncio.as_completed()函數(shù)可以在協(xié)程中按照完成順序獲取任務(wù)的結(jié)果。

8. 如何在協(xié)程中限制并發(fā)數(shù)?

使用asyncio.Queueasyncio.Semaphore可以在協(xié)程中限制并發(fā)數(shù)。

9. 如何調(diào)試協(xié)程?

使用pdb調(diào)試器、asyncio.get_event_loop()函數(shù)、asyncio.create_task()函數(shù)、asyncio.gather()
函數(shù)、asyncio.as_completed()函數(shù)和asyncio.wait()函數(shù)可以調(diào)試協(xié)程。

10. 如何優(yōu)化協(xié)程性能?

使用asyncio.gather()函數(shù)、asyncio.sleep()函數(shù)、asyncio.wait()函數(shù)、asyncio.as_completed()函數(shù)和asyncio.Queue
asyncio.Semaphore可以優(yōu)化協(xié)程性能。

11. 如何在協(xié)程中處理異常?

使用tryexcept語(yǔ)句可以在協(xié)程中處理異常。如果在協(xié)程中發(fā)生異常,可以使用asyncio.exceptions.AsyncioFuture.get_result()
函數(shù)獲取異常信息。

12. 如何在協(xié)程中實(shí)現(xiàn)超時(shí)?

使用asyncio.wait_for()函數(shù)可以在協(xié)程中實(shí)現(xiàn)超時(shí)。如果在超時(shí)時(shí)間內(nèi)未完成,可以使用asyncio.wait_for()函數(shù)中的timeout
參數(shù)設(shè)置超時(shí)時(shí)間。

13. 如何在協(xié)程中實(shí)現(xiàn)定時(shí)任務(wù)?

使用asyncio.create_task()函數(shù)和asyncio.sleep()
函數(shù)可以在協(xié)程中實(shí)現(xiàn)定時(shí)任務(wù)。可以在協(xié)程中創(chuàng)建一個(gè)新的任務(wù),并使用asyncio.sleep()函數(shù)設(shè)置定時(shí)時(shí)間。

14. 如何在協(xié)程中實(shí)現(xiàn)循環(huán)任務(wù)?

使用asyncio.create_task()函數(shù)和asyncio.sleep()
函數(shù)可以在協(xié)程中實(shí)現(xiàn)循環(huán)任務(wù)。可以在協(xié)程中創(chuàng)建一個(gè)新的任務(wù),并使用asyncio.sleep()函數(shù)設(shè)置循環(huán)時(shí)間。

15. 如何在協(xié)程中實(shí)現(xiàn)并發(fā)限制?

使用asyncio.Semaphore可以在協(xié)程中實(shí)現(xiàn)并發(fā)限制??梢栽趨f(xié)程中創(chuàng)建一個(gè)asyncio.Semaphore
對(duì)象,并使用asyncio.Semaphore.acquire()函數(shù)獲取信號(hào)量,使用asyncio.Semaphore.release()函數(shù)釋放信號(hào)量。

16. 如何在協(xié)程中實(shí)現(xiàn)任務(wù)優(yōu)先級(jí)?

使用asyncio.PriorityQueue可以在協(xié)程中實(shí)現(xiàn)任務(wù)優(yōu)先級(jí)。可以在協(xié)程中創(chuàng)建一個(gè)asyncio.PriorityQueue
對(duì)象,并使用asyncio.PriorityQueue.put()函數(shù)添加任務(wù),使用asyncio.PriorityQueue.get()函數(shù)獲取優(yōu)先級(jí)最高的任務(wù)。

17. 如何在協(xié)程中實(shí)現(xiàn)任務(wù)取消?

使用asyncio.create_task()函數(shù)和asyncio.Task.cancel()
函數(shù)可以在協(xié)程中實(shí)現(xiàn)任務(wù)取消??梢栽趨f(xié)程中創(chuàng)建一個(gè)新的任務(wù),并使用asyncio.Task.cancel()函數(shù)取消任務(wù)。

18. 如何在協(xié)程中實(shí)現(xiàn)任務(wù)超時(shí)?

使用asyncio.wait_for()函數(shù)和asyncio.Task.cancel()
函數(shù)可以在協(xié)程中實(shí)現(xiàn)任務(wù)超時(shí)??梢栽趨f(xié)程中創(chuàng)建一個(gè)新的任務(wù),并使用asyncio.wait_for()
函數(shù)設(shè)置超時(shí)時(shí)間,如果在超時(shí)時(shí)間內(nèi)未完成,可以使用asyncio.Task.cancel()函數(shù)取消任務(wù)。

19. 如何在協(xié)程中實(shí)現(xiàn)任務(wù)隊(duì)列?

使用asyncio.Queue可以在協(xié)程中實(shí)現(xiàn)任務(wù)隊(duì)列??梢栽趨f(xié)程中創(chuàng)建一個(gè)asyncio.Queue對(duì)象,并使用asyncio.Queue.put()
函數(shù)添加任務(wù),使用asyncio.Queue.get()函數(shù)獲取任務(wù)。

20. 如何在協(xié)程中實(shí)現(xiàn)任務(wù)分組?

使用asyncio.gather()函數(shù)可以在協(xié)程中實(shí)現(xiàn)任務(wù)分組??梢栽趨f(xié)程中使用asyncio.gather()
函數(shù)分組多個(gè)任務(wù),并使用asyncio.gather()函數(shù)中的return_exceptions參數(shù)設(shè)置是否返回異常信息。文章來源地址http://www.zghlxwxcb.cn/news/detail-860122.html

到了這里,關(guān)于深入理解Python協(xié)程:從基礎(chǔ)到實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 〖Python網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)?〗- 協(xié)程基本原理

    訂閱:新手可以訂閱我的其他專欄。免費(fèi)階段訂閱量1000+ ????????????????python項(xiàng)目實(shí)戰(zhàn) ???????????????? Python編程基礎(chǔ)教程系列(零基礎(chǔ)小白搬磚逆襲) 說明:本專欄持續(xù)更新中,訂閱本專欄前必讀關(guān)于專欄〖Python網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)〗轉(zhuǎn)為付費(fèi)專欄的訂閱說明 作者

    2024年02月16日
    瀏覽(20)
  • 【linux深入剖析】深入理解基礎(chǔ)外設(shè)--磁盤以及理解文件系統(tǒng)

    【linux深入剖析】深入理解基礎(chǔ)外設(shè)--磁盤以及理解文件系統(tǒng)

    ??你好,我是 RO-BERRY ?? 致力于C、C++、數(shù)據(jù)結(jié)構(gòu)、TCP/IP、數(shù)據(jù)庫(kù)等等一系列知識(shí) ??感謝你的陪伴與支持 ,故事既有了開頭,就要畫上一個(gè)完美的句號(hào),讓我們一起加油 我們所有的文件都是與進(jìn)程相關(guān)的文件–進(jìn)程打開的文件 系統(tǒng)中是不是所有的文件都被打開了呢?如果沒

    2024年04月11日
    瀏覽(24)
  • Python滲透測(cè)試編程基礎(chǔ)——線程、進(jìn)程與協(xié)程

    Python滲透測(cè)試編程基礎(chǔ)——線程、進(jìn)程與協(xié)程

    目錄 ?一、進(jìn)程與線程的概念 1.進(jìn)程 2.線程 3.進(jìn)程和線程的關(guān)系 4.任務(wù)執(zhí)行方式 二、Python中的Threading模塊 1.線程模塊介紹 2.Threading介紹 (1)方法和屬性 (2)類方法 三、線程簡(jiǎn)單編寫 1.流程 2.創(chuàng)建線程 (1)方法一 (2)方法二 3.例子 四、守護(hù)線程 五、線程同步技術(shù) 1.線程

    2024年02月01日
    瀏覽(25)
  • Elasticsearch深入理解 并發(fā)寫入導(dǎo)致版本沖突解決方案【實(shí)戰(zhàn)】

    Elasticsearch深入理解 并發(fā)寫入導(dǎo)致版本沖突解決方案【實(shí)戰(zhàn)】

    ? ? ?數(shù)據(jù)同步中,在使用阿里云Elasticsearch7.10.0版本的集群作為目標(biāo)數(shù)據(jù)源時(shí),在連續(xù)寫入同一文檔(document)出現(xiàn)版本沖突問題。 注意:以下所述均以阿里云7.10.0版本的Elasticsearch集群為前提(不同版本可能會(huì)稍有不同) ? ? ? 以生產(chǎn)環(huán)境的錯(cuò)誤日志信息為例: ElasticsearchSta

    2023年04月18日
    瀏覽(20)
  • STM32實(shí)戰(zhàn)之深入理解I2C通信協(xié)議

    STM32實(shí)戰(zhàn)之深入理解I2C通信協(xié)議

    目錄 I2C的物理層 I2C的協(xié)議層 I2C特點(diǎn) I2C 總線時(shí)序圖 軟件模擬I2C時(shí)序分享 軟件模擬IIC驅(qū)動(dòng)AT24C02分享 例程簡(jiǎn)介 例程分享 STM32的I2C外設(shè) IIC(Inter-Integrated Circuit),也稱為I2C或TWI(Two-Wire Interface),是一種廣泛使用的串行總線接口,用于連接低速度的集成電路。這種通信協(xié)

    2024年02月03日
    瀏覽(17)
  • 【C語(yǔ)言基礎(chǔ)】:深入理解指針(三)

    【C語(yǔ)言基礎(chǔ)】:深入理解指針(三)

    指針系列回顧 : 【C語(yǔ)言基礎(chǔ)】:深入理解指針(一) 【C語(yǔ)言基礎(chǔ)】:深入理解指針(二) 一、冒泡排序 冒泡排序的核心思想就是:兩兩相鄰的元素進(jìn)行比較。 可以看到,這段代碼對(duì)arr數(shù)組進(jìn)行了排序,但這個(gè)代碼還有一些缺陷,那就是無論數(shù)組內(nèi)部的元素是否有序,他都會(huì)循

    2024年03月10日
    瀏覽(25)
  • 深入理解機(jī)器學(xué)習(xí)——關(guān)聯(lián)規(guī)則挖掘:基礎(chǔ)知識(shí)

    深入理解機(jī)器學(xué)習(xí)——關(guān)聯(lián)規(guī)則挖掘:基礎(chǔ)知識(shí)

    分類目錄:《深入理解機(jī)器學(xué)習(xí)》總目錄 許多商業(yè)企業(yè)在日復(fù)一日的運(yùn)營(yíng)中積聚了大量的數(shù)據(jù)。例如,食品商店的收銀臺(tái)每天都收集大量的顧客購(gòu)物數(shù)據(jù)。下圖給出一個(gè)這種數(shù)據(jù)的例子,通常稱作購(gòu)物籃事務(wù)(Market Basket Transaction)。表中每一行對(duì)應(yīng)一個(gè)事務(wù),包含一個(gè)唯一

    2024年02月10日
    瀏覽(28)
  • 深入理解 HTTP Authorization 頭:基礎(chǔ)知識(shí)

    深入理解 HTTP Authorization 頭:基礎(chǔ)知識(shí)

    在當(dāng)今的互聯(lián)網(wǎng)世界中,安全性貫穿于 web 應(yīng)用的每個(gè)方面,HTTP Authorization 頭的使用在這個(gè)過程中扮演著不可或缺的角色。它是 HTTP 請(qǐng)求中的一個(gè)重要部分,用來在客戶端和服務(wù)器之間安全地傳輸認(rèn)證信息。用途廣泛,無論是瀏覽器還是其他客戶端應(yīng)用,都依賴它來驗(yàn)證用戶

    2024年04月15日
    瀏覽(27)
  • 深入理解 C++ 語(yǔ)法:從基礎(chǔ)知識(shí)到高級(jí)應(yīng)用

    讓我們將以下代碼分解以更好地理解它: 示例 示例解釋 第 1 行: #include iostream 是一個(gè)頭文件庫(kù),它讓我們可以使用輸入和輸出對(duì)象,比如 cout (在第 5 行使用)。頭文件為 C++ 程序添加功能。 第 2 行: using namespace std 表示我們可以使用標(biāo)準(zhǔn)庫(kù)中的對(duì)象和變量名稱。 如果你

    2024年03月23日
    瀏覽(21)
  • 《深入理解Java虛擬機(jī)》 JAVA 字節(jié)碼指令 基礎(chǔ)

    《深入理解Java虛擬機(jī)》 JAVA 字節(jié)碼指令 基礎(chǔ)

    解釋時(shí),JVM會(huì)為方法分配一個(gè)棧幀,而棧幀又由 局部變量表,操作數(shù)幀,方法引用,動(dòng)態(tài)鏈接 組成 方法中的每條指令執(zhí)行時(shí),要求該指令的操作數(shù)已經(jīng)壓入棧中;執(zhí)行指令時(shí)會(huì)將操作數(shù)從棧中彈出,是否將操作數(shù)再次壓入棧中取決與具體的命令。 new,dup指令 使用new

    2024年02月05日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包