python基礎===基於requests模塊上的協程【trip】


今天看博客get了一個有趣的模塊,叫做 trip     #(pip install  trip)

兼容2.7版本

基於兩大依賴包:TRIP: Tornado & Requests In Pair

先看一下simple code:

import trip

@trip.coroutine
def main():
    r = yield trip.get('http://www.baidu.com/‘)
    print(r.content)

trip.run(main)

 

於是又做了一個比較:

 

import time, functools
import requests,trip



def timeit(fn):
    start_time = time.time()
    fn()
    return time.time() - start_time

url = 'https://www.baidu.com/'
times = 100

def fetch():
    r = [requests.get(url) for i in range(times)]
    return r

@trip.coroutine
def  async_fetch():
    r = yield[trip.get(url) for i in range(times)]
    raise trip.Return(r)


print("[+]Non-trip cost: %ss" % timeit(fetch))
print("[+]Trip cost: %ss" % timeit(functools.partial(trip.run,async_fetch)))


#result
#[+]Non-trip cost: 14.9129998684s
#[+]Trip cost: 1.83399987221s

14.9秒和1.8秒的差距,效果顯而易見!

 

在爬蟲中的比較,普通爬蟲:

import requests

url = 'http://httpbin.org'
s = requests.Session()

def fetch(times=10):
    s.get('%s/cookies/set?name=value' % url)
    r = [s.get('%s/get' % url) for i in range(times)]
    print r

fetch()

加入trip優化后的:

import trip

url = 'http://httpbin.org'
s = trip.Session()

@trip.coroutine
def fetch(times=10):
    yield s.get('%s/cookies/set?name=value' % url)
    r = yield [s.get('%s/get' % url) for i in range(times)]
    print r

trip.run(fetch)

在原基礎上更改不大。

 

順便提一下


 

如果你也喜歡Python 這里有一群Python愛好者匯集在此。

關注微信公眾號:【軟件測試技術】,回復 888,獲取QQ群號。 


免責聲明!

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



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