异步发送请求的几种方式

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

猜你喜欢

转载自www.cnblogs.com/yunxintryyoubest/p/10033680.html
今日推荐