【发布时间】:2016-03-20 12:06:13
【问题描述】:
解析来自 Wikipedia 的数据需要很长的时间。我想做而不是一个线程\进程,至少5个。谷歌搜索后我发现在Python 3.5中有async for。
下面是当前“同步”代码的“非常短”版本,用于显示整个过程(使用 cmets 可以快速了解代码的作用)。
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() 以及在哪里使用的信息,以及如何\在哪里指定可以同时运行多少次循环迭代?有人可以帮我使loop for 异步吗?
【问题讨论】:
标签: django python-3.x asynchronous python-asyncio