【发布时间】:2019-07-25 15:27:23
【问题描述】:
我正在尝试使用 multiprocessing.Pool 下载和提取 zip 文件。但每次我执行脚本时,只会下载 3 个 zips 并且目录中看不到剩余文件(CPU % 为也触及 100%)。有人可以帮助我如何解决这个问题/建议更好的方法并遵循我尝试过的 sn-p。我对多处理完全陌生。我的目标是在不达到最大 CPU 的情况下并行下载多个文件。
import StringIO
import os
import sys
import zipfile
from multiprocessing import Pool, cpu_count
import requests
filePath = os.path.dirname(os.path.abspath(__file__))
print("filePath is %s " % filePath)
sys.path.append(filePath)
url = ["http://mlg.ucd.ie/files/datasets/multiview_data_20130124.zip",
"http://mlg.ucd.ie/files/datasets/movielists_20130821.zip",
"http://mlg.ucd.ie/files/datasets/bbcsport.zip",
"http://mlg.ucd.ie/files/datasets/movielists_20130821.zip",
"http://mlg.ucd.ie/files/datasets/3sources.zip"]
def download_zips(url):
file_name = url.split("/")[-1]
response = requests.get(url)
sourceZip = zipfile.ZipFile(StringIO.StringIO(response.content))
print("\n Downloaded {} ".format(file_name))
sourceZip.extractall(filePath)
print("extracted {} \n".format(file_name))
sourceZip.close()
if __name__ == "__main__":
print("There are {} CPUs on this machine ".format(cpu_count()))
pool = Pool(cpu_count())
results = pool.map(download_zips, url)
pool.close()
pool.join()
下面的输出
filePath is C:\Users\Documents\GitHub\Python-Examples-Internet\multi_processing
There are 4 CPUs on this machine
filePath is C:\Users\Documents\GitHub\Python-Examples-Internet\multi_processing
filePath is C:\Users\Documents\GitHub\Python-Examples-Internet\multi_processing
filePath is C:\Users\Documents\GitHub\Python-Examples-Internet\multi_processing
filePath is C:\Users\Documents\GitHub\Python-Examples-Internet\multi_processing
Downloaded bbcsport.zip
extracted bbcsport.zip
Downloaded 3sources.zip
extracted 3sources.zip
Downloaded multiview_data_20130124.zip
Downloaded movielists_20130821.zip
Downloaded movielists_20130821.zip
extracted multiview_data_20130124.zip
extracted movielists_20130821.zip
extracted movielists_20130821.zip
【问题讨论】:
-
如果您的操作系统是 Windows,则为 Windows 保留 1 个内核。因此,您可以使用 3 个核心来计算。 Linux 为您提供一切。默认情况下,应用程序以
full access计入资源。例如,在 Java 中,您可以限制 RAM 的使用,但不能限制 CPU / 磁盘。为了解决这个问题,您需要使用虚拟机,如 WMware、Docker,在其中限制 CPU、Ram、DIsc 等资源...... -
我在windows VM中尝试过限制
pool = Pool(1),但结果是一样的,我在目录中只看到3个文件。我的 8 核 CPU linux 机器也一样。
标签: python python-multiprocessing