【发布时间】:2020-06-27 13:20:49
【问题描述】:
我正在尝试加快一些调用 api_caller() 的代码,这是一个生成器,您可以对其进行迭代以获得结果。
我的同步代码如下所示:
def process_comment_tree(p):
# time consuming breadth first search that makes another api call...
return
def process_post(p):
process_comment_tree(p)
def process_posts(kw):
for p in api_caller(query=kw): #possibly 1000s of results
process_post(p)
def process_kws(kws):
for kw in kws:
process_posts(kw)
process_kws(kws=['python', 'threads', 'music'])
当我在kws 的长列表上运行此代码时,大约需要 18 分钟才能完成。
当我使用线程时:
with concurrent.futures.ThreadPoolExecutor(max_workers=len(KWS)) as pool:
for result in pool.map(process_posts, ['python', 'threads', 'music']):
print(f'result: {result}')
代码在大约 3 分钟内完成。
现在,我第一次尝试使用 Trio,但遇到了麻烦。
async def process_comment_tree(p):
# same as before...
return
async def process_post(p):
await process_comment_tree(p)
async def process_posts(kw):
async with trio.open_nursery() as nursery:
for p in r.api.search_submissions(query=kw)
nursery.start_soon(process_post, p)
async def process_kws(kws):
async with trio.open_nursery() as nursery:
for kw in kws:
nursery.start_soon(process_posts, kw)
trio.run(process_kws, ['python', 'threads', 'music'])
这仍然需要大约 18 分钟才能执行。我在这里做错了什么,还是三重奏/异步之类的东西不适合我的问题设置?
【问题讨论】:
-
这个
r.api.search_submissions似乎是一个同步调用,它会阻塞,所以你一次只能运行一个。 -
是的,似乎是这样。如果不深入研究外部api,就没有办法解决这个问题吗?为什么线程版的速度这么快?
标签: python multithreading asynchronous python-trio