尝试使用ThreadPoolExecutor下载~200个文件 - >一些文件被跳过

时间:2016-04-20 13:51:01

标签: multithreading python-3.x download python-multithreading

我需要下载~200个文件。如果我第一次运行下面的代码,代码下载~100个文件。然后我需要多次运行此代码才能下载其余文件(即如果我第二次运行代码 - 我可以获得+ 20-30个新文件,如果是第3次 - 再次+ 20-30,等等上)。为什么会发生这种情况\如何修复?也许这很重要 - 服务器可能会生成一些文件,最长可达10秒。

import os
import concurrent.futures
import urllib.request
import shutil

def get_cities(osm_id, file_name, place_type):
    file_folder = os.path.join(os.getcwd(), place_type)
    file_name = file_name + '_' + place_type
    file_path = os.path.join(file_folder, file_name)

    if not os.path.exists(file_folder):
        os.makedirs(file_folder)

    if not os.path.exists(file_path):
        area_id = str(3600000000 + osm_id)

        url = 'http://overpass-api.de/api/interpreter?data=(node["place"="city"](area:'+area_id+'););out;'

        with urllib.request.urlopen(url) as response, open(file_path, 'wb') as out_file:
            shutil.copyfileobj(response, out_file)

def cities_controller(place_type='cities'):
    countries = Countries.objects.filter(status=1).exclude(osm_id=None)
    en_group_inst = Languages.objects.filter(iso_code='en').first().group

    with concurrent.futures.ThreadPoolExecutor(max_workers=multiprocessing.cpu_count()) as executor:
        for country in countries:
            osm_id = country.osm_id
            file_name = CountriesTranslations.objects.get(
                country=country, lang_group=en_group_inst).common_name.lower().replace(' ', '_')

            executor.submit(get_cities, osm_id, file_name, place_type)

cities_controller()

0 个答案:

没有答案