需要帮助来制作 "loop for" 的异步版本

Need help to make asynchronous version of "loop for"

解析来自维基百科的数据花费的时间长得令人无法接受。我想做而不是一个 thread\process,至少 5 个。谷歌搜索后我发现在 Python 3.5 中有 async for.

下面是当前 "synced" 代码的 "very short" 版本,用于显示整个过程(带有注释以快速理解代码的作用)。

def update_data(region_id=None, country__inst=None, upper_region__inst=None):
    all_ids = []

    # Get data about countries or regions or subregions
    countries_or_regions_dict = OSM().get_countries_or_regions(region_id)

    # Loop that I want to make async
    for osm_id in countries_or_regions_dict:
        names = countries_or_regions_dict[osm_id]['names']

         if 'wiki_uri' in countries_or_regions_dict[osm_id]:
            wiki_uri = countries_or_regions_dict[osm_id]['wiki_uri']

            # PARSER: From Wikipedia gets translations of countries or regions or subregions
            translated_names = Wiki().get_translations(wiki_uri, osm_id)

            if not region_id:  # Means it is country
                country__inst = Countries.objects.update_or_create(osm_id=osm_id,
                                                                   defaults={**countries_regions_dict[osm_id]})[0]

            else: # Means it is region\subregion (in case of recursion)
                upper_region__inst = Regions.objects.update_or_create(osm_id=osm_id,
                                                                      country=country__inst,
                                                                      region=upper_region__inst,
                                                                      defaults={**countries_regions_dict[osm_id]})[0]
            # Add to DB translated names from wiki
            for lang_code in names:
                ###

            # RECURSION: If country has regions or region has subregions, start recursion
            if 'divisions' in countries_or_regions_dict[osm_id]:
                regions_list = countries_or_regions_dict[osm_id]['divisions']

                for division_id in regions_list:
                    all_regions_osm_ids = update_osm(region_id=division_id, country__inst=country__inst,
                                                              upper_region__inst=upper_region__inst)

                    all_ids += all_regions_osm_ids

    return all_ids

我意识到我需要将 def update_data 更改为 async def update_data 并相应地将 for osm_id in countries_or_regions_dict 更改为 async for osm_id in countries_or_regions_dict,

但我找不到关于在我的情况下是否有必要使用 get_event_loop() 以及在哪里使用的信息,以及 how\where 来指定循环的迭代次数 运行 同时?有人可以帮我让 loop for 异步吗?

asyncio模块不会创建多个threads/process,它运行代码在一个线程,一个进程中,但可以处理情况,有I/O块(如果您以特殊方式编写代码)。 ,什么时候应该用asyncio.

一旦您的代码具有同步特性,我建议您使用线程而不是 asyncio。创建 ThreadPoolExecutor 并使用它在多线程中解析 Wiki。