网站建设主要用什么软件,yeti2.0 wordpress,最火的传奇手游网站,寿县住房与城乡建设局网站这里我们通过请求网页例子来一步步理解爬虫性能
当我们有一个列表存放了一些url需要我们获取相关数据#xff0c;我们首先想到的是循环
简单的循环串行
这一种方法相对来说是最慢的#xff0c;因为一个一个循环#xff0c;耗时是最长的#xff0c;是所有的时间总和 代码…这里我们通过请求网页例子来一步步理解爬虫性能
当我们有一个列表存放了一些url需要我们获取相关数据我们首先想到的是循环
简单的循环串行
这一种方法相对来说是最慢的因为一个一个循环耗时是最长的是所有的时间总和 代码如下这里我们通过请求网页例子来一步步理解爬虫性能
当我们有一个列表存放了一些url需要我们获取相关数据我们首先想到的是循环
简单的循环串行
这一种方法相对来说是最慢的因为一个一个循环耗时是最长的是所有的时间总和 代码如下
import requestsurl_list [http://www.baidu.com,http://www.pythonsite.com,http://www.cnblogs.com/
]for url in url_list:result requests.get(url)print(result.text)通过线程池
通过线程池的方式访问这样整体的耗时是所有连接里耗时最久的那个相对循环来说快了很多
import requests
from concurrent.futures import ThreadPoolExecutordef fetch_request(url):result requests.get(url)print(result.text)url_list [http://www.baidu.com,http://www.bing.com,http://www.cnblogs.com/
]
pool ThreadPoolExecutor(10)for url in url_list:#去线程池中获取一个线程线程去执行fetch_request方法pool.submit(fetch_request,url)pool.shutdown(True)线程池回调函数
这里定义了一个回调函数callback线程池回调函数
这里定义了一个回调函数callback
from concurrent.futures import ThreadPoolExecutor
import requestsdef fetch_async(url):response requests.get(url)return responsedef callback(future):print(future.result().text)url_list [http://www.baidu.com,http://www.bing.com,http://www.cnblogs.com/
]pool ThreadPoolExecutor(5)for url in url_list:v pool.submit(fetch_async,url)#这里调用回调函数v.add_done_callback(callback)pool.shutdown()通过进程池
通过进程池的方式访问同样的也是取决于耗时最长的但是相对于线程来说进程需要耗费更多的资源同时这里是访问url时IO操作所以这里线程池比进程池更好
import requests
from concurrent.futures import ProcessPoolExecutordef fetch_request(url):result requests.get(url)print(result.text)url_list [http://www.baidu.com,http://www.bing.com,http://www.cnblogs.com/
]
pool ProcessPoolExecutor(10)for url in url_list:#去进程池中获取一个线程子进程程去执行fetch_request方法pool.submit(fetch_request,url)pool.shutdown(True)进程池回调函数
这种方式和线程回调函数的效果是一样的相对来说开进程比开线程浪费资源
from concurrent.futures import ProcessPoolExecutor
import requestsdef fetch_async(url):response requests.get(url)return responsedef callback(future):print(future.result().text)url_list [http://www.baidu.com,http://www.bing.com,http://www.cnblogs.com/
]pool ProcessPoolExecutor(5)for url in url_list:v pool.submit(fetch_async, url)# 这里调用回调函数v.add_done_callback(callback)pool.shutdown()主流的单线程实现并发的几种方式
asyncio gevent Twisted Tornado 下面分别是这四种代码的实现例子
asyncio例子1
import asyncioasyncio.coroutine #通过这个装饰器装饰
def func1():print(before...func1......)# 这里必须用yield from并且这里必须是asyncio.sleep不能是time.sleepyield from asyncio.sleep(2)print(end...func1......)tasks [func1(), func1()]loop asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()