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)