国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

淺析Python中的多進程與多線程的使用

2020-02-23 00:33:51
字體:
來源:轉載
供稿:網友

在批評Python的討論中,常常說起Python多線程是多么的難用。還有人對 global interpreter lock(也被親切的稱為“GIL”)指指點點,說它阻礙了Python的多線程程序同時運行。因此,如果你是從其他語言(比如C++或Java)轉過來的話,Python線程模塊并不會像你想象的那樣去運行。必須要說明的是,我們還是可以用Python寫出能并發或并行的代碼,并且能帶來性能的顯著提升,只要你能顧及到一些事情。如果你還沒看過的話,我建議你看看Eqbal Quran的文章《Ruby中的并發和并行》。

在本文中,我們將會寫一個小的Python腳本,用于下載Imgur上最熱門的圖片。我們將會從一個按順序下載圖片的版本開始做起,即一個一個地下載。在那之前,你得注冊一個Imgur上的應用。如果你還沒有Imgur賬戶,請先注冊一個。

本文中的腳本在Python3.4.2中測試通過。稍微改一下,應該也能在Python2中運行——urllib是兩個版本中區別最大的部分。
開始動手

讓我們從創建一個叫“download.py”的Python模塊開始。這個文件包含了獲取圖片列表以及下載這些圖片所需的所有函數。我們將這些功能分成三個單獨的函數:

  get_links  download_link  setup_download_dir

第三個函數,“setup_download_dir”,用于創建下載的目標目錄(如果不存在的話)。

Imgur的API要求HTTP請求能支持帶有client ID的“Authorization”頭部。你可以從你注冊的Imgur應用的面板上找到這個client ID,而響應會以JSON進行編碼。我們可以使用Python的標準JSON庫去解碼。下載圖片更簡單,你只需要根據它們的URL獲取圖片,然后寫入到一個文件即可。

代碼如下:
 

import jsonimport loggingimport osfrom pathlib import Pathfrom urllib.request import urlopen, Request logger = logging.getLogger(__name__) def get_links(client_id):  headers = {'Authorization': 'Client-ID {}'.format(client_id)}  req = Request('https://api.imgur.com/3/gallery/', headers=headers, method='GET')  with urlopen(req) as resp:    data = json.loads(resp.readall().decode('utf-8'))  return map(lambda item: item['link'], data['data']) def download_link(directory, link):  logger.info('Downloading %s', link)  download_path = directory / os.path.basename(link)  with urlopen(link) as image, download_path.open('wb') as f:    f.write(image.readall()) def setup_download_dir():  download_dir = Path('images')  if not download_dir.exists():    download_dir.mkdir()  return download_dir

接下來,你需要寫一個模塊,利用這些函數去逐個下載圖片。我們給它命名為“single.py”。它包含了我們最原始版本的Imgur圖片下載器的主要函數。這個模塊將會通過環境變量“IMGUR_CLIENT_ID”去獲取Imgur的client ID。它將會調用“setup_download_dir”去創建下載目錄。最后,使用get_links函數去獲取圖片的列表,過濾掉所有的GIF和專輯URL,然后用“download_link”去將圖片下載并保存在磁盤中。下面是“single.py”的代碼:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邵阳市| 陆川县| 忻州市| 金平| 汉寿县| 定兴县| 松潘县| 克什克腾旗| 独山县| 普兰店市| 富源县| 齐河县| 黔东| 永州市| 涿鹿县| 曲沃县| 巩留县| 那曲县| 鄂尔多斯市| 乡宁县| 将乐县| 锡林浩特市| 健康| 宁乡县| 凤庆县| 通江县| 阳山县| 凤山县| 桃源县| 海门市| 中阳县| 原平市| 潞西市| 芜湖市| 前郭尔| 德兴市| 堆龙德庆县| 梁平县| 望都县| 简阳市| 阳新县|