【发布时间】:2017-04-12 22:36:52
【问题描述】:
我正在尝试自学 asyncio,因此我构建了一个 web scraper 作为练习。主要工作部分是以下递归函数...
async def get_gids(base_url='http://gd2.mlb.com/components/game/mlb/'):
soup = await get_soup(base_url)
for link in soup.find_all('a'):
dest = link.get('href')
fut = asyncio.Future()
def set_result(out):
try:
fut.set_result(out.result())
except:
pass
if dest.startswith('year_') and dest[YEAR] in VALID_YEARS:
in_fut = asyncio.ensure_future(get_gids(base_url + dest))
in_fut.add_done_callback(set_result)
elif dest.startswith('month_') and dest[MONTH] in VALID_MONTHS:
in_fut = asyncio.ensure_future(get_gids(base_url + dest))
in_fut.add_done_callback(set_result)
elif dest.startswith('day_'):
in_fut = asyncio.ensure_future(get_gids(base_url + dest))
in_fut.add_done_callback(set_result)
elif dest.startswith('gid_'):
if await is_regular_season(base_url + dest):
print('gid: {}'.format(dest))
gids.append(dest)
else:
pass
在run_forever 循环中,这很有效。但是,希望它运行并完成而无需我杀死它,例如run_unitl_complete(get_gids()),但这似乎不起作用,因为我只得到第一页。我试过这个...
f = asyncio.wait(get_gids())
loop.run_until_complete(f)
再次引发 TypeError 没有成功...TypeError: expect a list of futures, not coroutine
在原始函数调用从调用堆栈中弹出之前,我该怎么做才能运行循环?
【问题讨论】:
-
您是如何使用
run_forever安排get_gids的? -
loop = asyncio.get_event_loop(); asyncio.ensure_future(get_gids(base_url)); loop.run_forever() -
我想对您的问题进行投票,因为它对理解理论非常好奇和有用。但是您的代码 sn-p 非常复杂且具体。我花了很多时间来简化它以捕捉本质。请让您的代码更简单、更通用。它可以帮助人们!
标签: python recursion python-3.5 future python-asyncio