需要帮助来制作 "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。
解析来自维基百科的数据花费的时间长得令人无法接受。我想做而不是一个 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。