Python使用gevent實現協程

 

# 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")
    ])

結果爲:git

>>> 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協程對象,並運行它github

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

 

若是想獲取協程返回的數據,能夠這樣作:fetch

# 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)

結果爲:url

>>> 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)
相關文章
相關標籤/搜索