欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python用yield from實現(xiàn)異步協(xié)程爬蟲的實踐

 更新時間:2023年01月18日 10:35:47   作者:Python無霸哥  
本文主要介紹了Python用yield from實現(xiàn)異步協(xié)程爬蟲的實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、什么是yield

如果還沒有怎么用過的話,直接把yield看做成一種特殊的return(PS:本質(zhì) generator(生成器))
return是返回一個值然后就終斷函數(shù)了,而yield返回的是一個生成器(PS:不知道的直接看作特殊列表,看下面的代碼案例)

# -*- coding: utf-8 -*-
# @Time    : 2022/11/10 16:17
# @Author  : 紅后
# @Email   : not_enabled@163.com
# @blog    : https://www.cnblogs.com/Red-Sun
# @File    : 實例1.py
# @Software: PyCharm

def main():
    '''
    遍歷0到4,這五個數(shù),并分別打印
    '''
    for num in range(5):
        yield num

if __name__ == '__main__':
    for num in main():
        print(num)
    print('-'*50)
    for num in [0, 1, 2, 3, 4]:
        print(num)

在這里插入圖片描述

將它看作列表用for循環(huán)遍歷,就能取出其中的值。

二、yield于列表的區(qū)別

它與原來列表的區(qū)別就在于,自帶的列表是固定的,而把yield看作列表的話是動態(tài)的。
具體案例描述請看代碼及備注(PS:個人自己描述的,有不對的地方望各位指點)

# -*- coding: utf-8 -*-
# @Time    : 2023/01/11 15:24
# @Author  : 紅后
# @Email   : not_enabled@163.com
# @blog    : https://www.cnblogs.com/Red-Sun
# @File    : 實例2.py
# @Software: PyCharm

def main():
    '''
    將yield看作一個動態(tài)列表,從yield左往右為傳出數(shù)據(jù),從又往左為傳入數(shù)據(jù)。
    PS:有yield存在的那一行,需要從左往右傳出數(shù)據(jù)跑一遍,數(shù)據(jù)出去以后又要從右往左帶接收的數(shù)據(jù)跑一遍,一共一行跑兩邊(僅作者個人記憶方法)
    '''
    Python學(xué)習(xí)群:748989764
    num1 = yield
    num2 = yield
    print(num1, num2)
    yield num1 + num2
if __name__ == '__main__':
    a = main()
    # 第一個next對應(yīng)第一個yield的右邊為空即None,所以動態(tài)列表中加入一個參數(shù)為None,返回值為列表的-1位是None
    print(next(a))  # [None]
    # 第二個通過send方法傳入一個數(shù)1,即在上一次停止的地方從右往左傳入?yún)?shù),所以給num1賦值為1.然后繼續(xù)找下一個yield,其右邊的值依舊為None,加入動態(tài)列表,此時返回值-1位依舊是None
    print(a.send(1))  # [None, None]
    # 第三通過send方法傳入一個數(shù)2,即在上一次停止的地方從右往左傳入?yún)?shù),所以給num2賦值為2.然后繼續(xù)找下一個yield,其右邊的值為num1 + num2,此時num1為1,num2為2,計算得返回值-1位為3
    print(a.send(2))  # [None, None, num1 + num2]

在這里插入圖片描述

三、yield from 實現(xiàn)協(xié)程

yield from 后面需要加可迭代對象
當(dāng)它后面加上生成器(上述所說的yield這種)便可以實現(xiàn)生成的嵌套

  • 老板(主程序):調(diào)用委派生成器
  • 包工頭(委派生成器):包含yield from表達式的生成器
  • 打工仔(子生成器):生成器函數(shù)

其中委派生成器的作用:在主程序與子生成器之間建立一個雙向通道。
所謂雙向通道是指,主程序可以將參數(shù)通過send傳遞給子生成器,子生成器的yield的值也可以直接返回給主函數(shù)。(PS:委派生成器只有創(chuàng)建通道的作用,沒有攔截數(shù)據(jù)這種功能)
也許有人會想直接用主程序調(diào)用子生成器不就行了,而對這的解釋是,使用yield from作為中間過渡是為了讓它幫我們進行異常處理(PS:類似寫程序為了正常運行加上try一個道理)

# -*- coding: utf-8 -*-
# @Time    : 2022/11/10 15:13
# @Author  : 紅后
# @Email   : not_enabled@163.com
# @blog    : https://www.cnblogs.com/Red-Sun
# @File    : coroutines.py
# @Software: PyCharm

import requests


def coroutines_spider():
    '''
    子生成器(PS: 打工仔,真正干活的)
    '''
    response = None  # 首次激活返回None,后期網(wǎng)頁響應(yīng)覆蓋
    while True:
        url = yield response
        response = requests.get(url)


def appoint():
    '''
    委派生成器,委托子生成器完成具體任務(wù) (PS: 類似包工頭負責(zé)勞務(wù)派遣)
    '''
    while True:
        yield from coroutines_spider()  # 建立子生成器和主函數(shù)的雙通道


def main(url_list: list):
    '''
    主函數(shù)(PS: 相當(dāng)于老板,張貼招人啟示)
    '''
    ul = appoint()  # 創(chuàng)建委派生成器
    next(ul)  # 激活它
    for url in url_list:
        response = ul.send(url)  # 將url作為參數(shù)傳遞進入子生成器中,返回子生成器yield出來的response
        print(response.url, response.status_code)  # 打印出response中的鏈接和狀態(tài)碼


if __name__ == '__main__':
    url_list = ['https://www.baidu.com/', 'https://www.4399.com/', 'https://cn.bing.com/', ]
    main(url_list=url_list)


在這里插入圖片描述

到此這篇關(guān)于Python用yield from實現(xiàn)異步協(xié)程爬蟲的實踐的文章就介紹到這了,更多相關(guān)Python yield from異步協(xié)程爬蟲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用pyecharts生成Echarts網(wǎng)頁的實例

    使用pyecharts生成Echarts網(wǎng)頁的實例

    今天小編就為大家分享一篇使用pyecharts生成Echarts網(wǎng)頁的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python安裝Imaging報錯:The _imaging C module is not installed問題解決方法

    Python安裝Imaging報錯:The _imaging C module is not installed問題解決

    這篇文章主要介紹了Python安裝Imaging報錯:The _imaging C module is not installed問題解決方法,原來是PIL庫的庫文件沒有加到系統(tǒng)中導(dǎo)致老是提示這個錯誤,需要的朋友可以參考下
    2014-08-08
  • python 網(wǎng)絡(luò)編程常用代碼段

    python 網(wǎng)絡(luò)編程常用代碼段

    這篇文章主要介紹了python 網(wǎng)絡(luò)編程常用代碼段,需要的朋友可以參考下
    2016-08-08
  • Python3實現(xiàn)的Mysql數(shù)據(jù)庫操作封裝類

    Python3實現(xiàn)的Mysql數(shù)據(jù)庫操作封裝類

    這篇文章主要介紹了Python3實現(xiàn)的Mysql數(shù)據(jù)庫操作封裝類,涉及Python針對mysql數(shù)據(jù)庫的連接、查詢、更新及關(guān)閉連接等相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • python-jwt用戶認證食用教學(xué)的實現(xiàn)方法

    python-jwt用戶認證食用教學(xué)的實現(xiàn)方法

    這篇文章主要介紹了python-jwt用戶認證食用教學(xué)的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 用Python實現(xiàn)校園通知更新提醒功能

    用Python實現(xiàn)校園通知更新提醒功能

    今天小編就為大家分享一篇用Python實現(xiàn)校園通知更新提醒功能,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python locust工具使用詳解

    Python locust工具使用詳解

    這篇文章主要介紹了Python locust工具使用詳解,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • 自動化測試時基于Python常用的幾個加密算法總結(jié)

    自動化測試時基于Python常用的幾個加密算法總結(jié)

    這幾天做自動化測試,遇到一個問題,那就是接口的請求的密碼是加密的,產(chǎn)品的要求是不能使用使用其他特殊手段,他給提供加密算法,需要在接口請求的時候,使用加密算法處理后的數(shù)據(jù)傳參,本文主要是整理了幾個加密算法,以便后續(xù)測試使用,需要的朋友可以參考下
    2023-12-12
  • Python裝飾器原理與用法分析

    Python裝飾器原理與用法分析

    這篇文章主要介紹了Python裝飾器原理與用法,結(jié)合實例形式分析了Python裝飾器的概念、原理、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2018-04-04
  • python中私有函數(shù)調(diào)用方法解密

    python中私有函數(shù)調(diào)用方法解密

    這篇文章主要介紹了python中私有函數(shù)調(diào)用方法,較為詳細的分析了Python私有函數(shù)的原理與調(diào)用技巧,需要的朋友可以參考下
    2016-04-04

最新評論