【发布时间】:2021-02-21 07:05:26
【问题描述】:
我最近在 Python 中使用了异步函数,我想知道如何将同步函数变成异步函数。
例如,有通过 google api pygoogletranslation 进行翻译的库。人们很可能想知道,如何异步翻译许多不同的单词。当然,你可以把它放在一个请求中,但是google api会认为它是一个文本并进行相应的处理,这会导致错误的结果。
这个代码怎么可能转:
from pygoogletranslation import Translator
translator = Translator()
translations = []
words = ['partying', 'sightseeing', 'sleeping', 'catering']
for word in words:
translations.append(translator.translate(word, src='en', dest='es'))
print(translations)
进入这个:
from pygoogletranslation import Translator
import asyncio
translator = Translator()
translation_tasks = []
words = ['partying', 'sightseeing', 'sleeping', 'catering']
for word in words:
asyncio.create_task(translator.translate(word, src='en', dest='es'))
translations = asyncio.run(
asyncio.gather(translation_tasks, return_exceptions=True)
)
print(translations)
考虑到函数translate 没有内置的async 实现?
【问题讨论】:
-
我的 javascript 大脑搜索 Promise.all 等价物:stackoverflow.com/questions/34377319/…。基本上将每个对谷歌的请求包装在一个异步函数中,并在异步函数数组完成后使用结果。
-
改用多线程或多处理
-
@MattWilde 如答案中所述,
asyncio.gather()与Promise.all最接近。关键区别在于其他地方:在 JavaScript 中,所有可能阻塞的东西默认都是异步的,而在 Python 中不是这种情况。
标签: python asynchronous async-await python-asyncio