1. 程式人生 > >非同步傳送請求的幾種方式

非同步傳送請求的幾種方式

asyncio:
# import    asyncio
# def  fun1():
#     print('start')
#     yield   from   asyncio.sleep(1)
#     print('end')
#
# tasks=[
# fun1(),fun1()
# ]
# loop=asyncio.get_event_loop()
# loop.run_until_complete(asyncio.gather(*tasks))
# loop.close()

 

gevent:開啟協程池

# ##協程池
#
# import   gevent
# import requests # def task(method,url,req_kwargs): # print(method,url) # response=requests.request(method=method,url=url) # print('結果',response,response.content) # from gevent.pool import Pool # pool=Pool(4) # gevent.joinall([ # pool.spawn(task, method='get', url='http://www.baidu.com',req_kwargs={}),
# pool.spawn(task, method='get', url='http://www.baidu.com',req_kwargs={}), # pool.spawn(task, method='get', url='http://www.baidu.com',req_kwargs={}), # pool.spawn(task, method='get', url='http://www.baidu.com',req_kwargs={}) # ] # )

 

greenlet:是對gevent進一步的封裝,詳情請檢視原始碼
# import   greenlet,grequests
# request_list=[ # grequests.get('http://www.baidu.com'), # grequests.get('http://www.baidu.com'), # grequests.get('http://www.baidu.com'), # grequests.get('http://www.baidu.com'), # ] # # ###執行並獲取響應列表 # response_list=grequests.map(request_list,size=10)###後面是可以開啟的協程池,後面可以加引數,詳細請檢視map方法 # print(response_list)

 

AsyncHTTPClient
from   tornado.httpclient import   AsyncHTTPClient
from    tornado.httpclient import  HTTPRequest
from   tornado  import  ioloop

count=0##設定計數器,當count為0的時候,就會終止這個死迴圈

'''咋這裡進行處理這個請求,當請求處理完成之後,就會終止這個迴圈'''
def  handler_response(response):
    global   count
    count-=1###當計數器為0的時候,就會自動終止

    if  response.error:
        print('error')
    else:
        print(response.body)
    ###在下面進行判斷,當是count為0,就進行終止這個迴圈,不在執行下去
    if  count==0:
        ioloop.IOLoop.current().stop()

'''在這裡開啟這個迴圈,迴圈遍歷所有的eurl,進行事件迴圈的的遍歷'''
def  fun():
    url_listy=[
        'http://www.baidu.com',
        'http://www.baidu.com',
        'http://www.baidu.com',
    ]
    for   url   in  url_listy:
        global  count###開啟計數器
        count=len(url_listy)
        print(url)
        htt_client=AsyncHTTPClient()##3建立這個物件
        htt_client.fetch(HTTPRequest(url),handler_response)#####當執行完之前的url之後,就自動執行後面的回撥函式的部分
        ##fetch是查詢的意思,建立了httpreqeust裡面,後面是回撥函式

ioloop.IOLoop.current().add_callback(fun)###將全部的url加全部的事件迴圈裡面
ioloop.IOLoop.current().start()