1. 程式人生 > >Python學習---IO的異步[gevent+Grequests模塊]

Python學習---IO的異步[gevent+Grequests模塊]

class python學習 png 異步 自己的 href hub fetch bar

安裝gevent模塊

pip3 install gevent

Gevent實例

import gevent
import requests
from gevent import monkey
# socket發送請求以後就會進入等待狀態,gevent更改了這個機制
# socket.setblocking(False)  -->發送請求後就不會等待服務器響應
monkey.patch_all()  # 找到內置的socket並更改為gevent自己的東西

def fetch_async(method, url, req_kwargs):
    print(method, url, req_kwargs)
    response = requests.request(method=method, url=url, **req_kwargs)
    print(response.url, response.content)

# ##### 發送請求 #####
gevent.joinall([
    # 這裏spawn是3個任務[實際是3個協程],每個任務都會執行fetch_async函數
    gevent.spawn(fetch_async, method=‘get‘, url=‘https://www.python.org/‘, req_kwargs={}),
    gevent.spawn(fetch_async, method=‘get‘, url=‘https://www.yahoo.com/‘, req_kwargs={}),
    gevent.spawn(fetch_async, method=‘get‘, url=‘https://github.com/‘, req_kwargs={}),
])

技術分享圖片

Gevent也是支持協程池

##### 發送請求(協程池控制最大協程數量) #####
# 也可以理解為先最大發送2個請求,2個請求結束後發送第三個請求
from gevent.pool import Pool
pool = Pool(2)  # 最多執行2個協程序,None表示不設置限制
gevent.joinall([
    pool.spawn(fetch_async, method=‘get‘, url=‘https://www.python.org/‘, req_kwargs={}),
    pool.spawn(fetch_async, method=‘get‘, url=‘https://www.yahoo.com/‘, req_kwargs={}),
    pool.spawn(fetch_async, method=‘get‘, url=‘https://www.github.com/‘, req_kwargs={}),
])

Grequests

安裝grequests

pip3 install grequests

grequests實際上就是封裝了gevent裏面的方法,然後配合requests實現異步的IO

grequests = gevent + request

grequests.map() 內部實現

技術分享圖片

Grequest實例

import grequests  # 實際上就是requests + gevent
request_list = [
    # 發送get請求
    grequests.get(‘https://www.baidu.com/‘, timeout=10.001),
    grequests.get(‘https://www.taobao.com/‘),
    grequests.get(‘https://hao.360.cn/‘)
]
# ##### 執行並獲取響應列表 #####
response_list = grequests.map(request_list)  # 實際上內部循環執行gevent內部的joinall()方法
print(response_list)

# ##### 執行並獲取響應列表(處理異常) #####
# def exception_handler(request, exception):
# print(request,exception)
#     print("Request failed")

# response_list = grequests.map(request_list, exception_handler=exception_handler)
# print(response_list)

技術分享圖片

Python學習---IO的異步[gevent+Grequests模塊]