異步發送請求的幾種方式

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

 

asyncio的另外一種方式:
import    asyncio

@asyncio.coroutine
def   task(host,url='/'):
    print('start',host)
    reader,writer=yield   from  asyncio.open_connection(host,80)###創建鏈接,和當前的www.baidu.com創建鏈接,會將這個域名解析成相對應的ip,進行鏈接

    # request_header_content='''GET  %s HTTP/1.0\r\nHost: %s\r\n\r\n'''%(url,host,)###在這裏配置請求頭
    request_header_content='''GET / HTTP/1.0\r\nHost:%s\r\n\r\n'''%(host,)###在這裏配置請求頭
    request_header_content=bytes(request_header_content,encoding='utf-8')

    writer.write(request_header_content)
    yield   from   writer.drain()
    text=yield   from   reader.read()
    print('end',host,url,text)
    writer.close()

tasks=[
task('www.baidu.com'),task('www.baidu.com')
]

loop=asyncio.get_event_loop()
results=loop.run_until_complete(asyncio.gather(*tasks))
loop.close()
 

gevent:開啓協程池async

# ##協程池
#
# 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()
相關文章
相關標籤/搜索