python使用gevent實現協程


gevent是一個基於協程的python網絡庫,在遇到IO阻塞時,程序會自動進行切換,可以讓我們用同步的方式寫異步IO代碼。

# coding:utf8
import requests
import gevent
from gevent import monkey
monkey.patch_all()      # 用於將標准庫中大部分阻塞式調用修改為協作式運行


def fetch(url):
    print("get: {}".format(url))
    response = requests.get(url).content
    print("{}: {}".format(url, len(response)))


if __name__ == "__main__":
    gevent.joinall([
        gevent.spawn(fetch, "https://stackoverflow.com/"),
        gevent.spawn(fetch, "https://www.douban.com"),
        gevent.spawn(fetch, "https://www.github.com")
    ])

結果為:

>>> get: https://stackoverflow.com/
>>> get: https://www.douban.com
>>> get: https://www.github.com
>>> https://www.douban.com: 94054
>>> https://www.github.com: 87186
>>> https://stackoverflow.com/: 261295

gevent.spawn()方法會創建一個新的greenlet協程對象,並運行它

gevent.joinall()方法的參數是一個協程對象列表,它會等待所有的協程都執行完畢后再退出

 

如果想獲取協程返回的數據,可以這樣做:

# coding:utf8
import requests
import gevent
from gevent import monkey
monkey.patch_all()      # 用於將標准庫中大部分阻塞式調用修改為協作式運行


def fetch(url):
    print("get: {}".format(url))
    response = requests.get(url).content
    return url, len(response)


if __name__ == "__main__":
    g_list = list()
    for url in ["https://stackoverflow.com/", "https://www.douban.com", "https://www.github.com"]:
        g = gevent.spawn(fetch, url)
        g_list.append(g)
    gevent.joinall(g_list)
    for g in g_list:
        print(g.value)

結果為:

>>> get: https://stackoverflow.com/
>>> get: https://www.douban.com
>>> get: https://www.github.com
>>> ('https://stackoverflow.com/', 260097)
>>> ('https://www.douban.com', 94050)
>>> ('https://www.github.com', 87180)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM