基于 I/O 的多线程
多线程的例子中比较多的就是抓取网页,因为抓取网页是典型的 I/O 开销,因此 Python 的多线程终于不显得那么鸡肋了。
我们把上面例子中的计算函数修改为抓取网站的大小。先用最标准的方式,不用线程。
# 标准方式抓取
>>> from time import time
>>> import requests
>>> list_url = ['http://www.qq.com', 'http://chuangyiji.com',
... 'http://taobao.com', 'http://mingrihui.com']
>>> def get_url_size(url):
... rq = requests.get(url)
... length = len(rq.content)
... print(url, length)
... return length
>>> start = time()
>>> for url in list_url:
... get_url_size(url)
>>> end = time()
>>> print('\ncost time {:f} s'.format(end - start))
http://www.qq.com 246846
http://chuangyiji.com 84537
http://taobao.com 123926
http://mingrihui.com 43480
cost time 11.283091 s
我在里面故意放了两个自己的网站(你没见过的那两个域名就是),一个网站是在国外,一个网站在国内的云主机上,相对访问速度比较慢,因此在执行程序的时候有时候会有明显的等待。对四个网站处理完,差不多要20秒左右或者更多。大家可以看到结果呈现的顺序是和列表中一样的。这是一个单线程的例子。
>>>阅读全文