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