欢迎来到天天文库
浏览记录
ID:8811446
大小:24.71 KB
页数:7页
时间:2018-04-08
《python并发与并行的新手指南》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Python并发与并行的新手指南在批评Python的讨论中,常常说起Python多线程是多么的难用。还有人对globalinterpreterlock(也被亲切的称为“GIL”)指指点点,说它阻碍了Python的多线程程序同时运行。因此,如果你是从其他语言(比如C++或Java)转过来的话,Python线程模块并不会像你想象的那样去运行。必须要说明的是,我们还是可以用Python写出能并发或并行的代码,并且能带来性能的显著提升,只要你能顾及到一些事情。如果你还没看过的话,我建议你看看EqbalQuran的文章《Ruby中的并发和并行》。在本文中,我们将会写一个小的Python脚
2、本,用于下载Imgur上最热门的图片。我们将会从一个按顺序下载图片的版本开始做起,即一个一个地下载。在那之前,你得注册一个Imgur上的应用。如果你还没有Imgur账户,请先注册一个。本文中的脚本在Python3.4.2中测试通过。稍微改一下,应该也能在Python2中运行——urllib是两个版本中区别最大的部分。开始动手让我们从创建一个叫“download.py”的Python模块开始。这个文件包含了获取图片列表以及下载这些图片所需的所有函数。我们将这些功能分成三个单独的函数:·get_links·download_link·setup_download_dir第三个函数,
3、“setup_download_dir”,用于创建下载的目标目录(如果不存在的话)。Imgur的API要求HTTP请求能支持带有clientID的“Authorization”头部。你可以从你注册的Imgur应用的面板上找到这个clientID,而响应会以JSON进行编码。我们可以使用Python的标准JSON库去解码。下载图片更简单,你只需要根据它们的URL获取图片,然后写入到一个文件即可。代码如下:importjsonimportloggingimportosfrompathlibimportPathfromurllib.requestimporturlopen,Reque
4、st logger=logging.getLogger(__name__) defget_links(client_id): headers={'Authorization':'Client-ID{}'.format(client_id)} req=Request('https://api.imgur.com/3/gallery/',headers=headers,method='GET') withurlopen(req)asresp: data=json.loads(resp.readall().decode('utf-8')) returnma
5、p(lambdaitem:item['link'],data['data']) defdownload_link(directory,link): logger.info('Downloading%s',link) download_path=directory/os.path.basename(link) withurlopen(link)asimage,download_path.open('wb')asf: f.write(image.readall()) defsetup_download_dir(): download_dir=Path('
6、images') ifnotdownload_dir.exists(): download_dir.mkdir() returndownload_dir接下来,你需要写一个模块,利用这些函数去逐个下载图片。我们给它命名为“single.py”。它包含了我们最原始版本的Imgur图片下载器的主要函数。这个模块将会通过环境变量“IMGUR_CLIENT_ID”去获取Imgur的clientID。它将会调用“setup_download_dir”去创建下载目录。最后,使用get_links函数去获取图片的列表,过滤掉所有的GIF和专辑URL,然后用“downloa
7、d_link”去将图片下载并保存在磁盘中。下面是“single.py”的代码:importloggingimportosfromtimeimporttime fromdownloadimportsetup_download_dir,get_links,download_link logging.basicConfig(level=logging.DEBUG,format='%(asctime)s-%(name)s-%(levelname)s-%(message)s')logging.getL
此文档下载收益归作者所有