python - Python异步调用分离函数
问题描述
我有如下 4 个函数,其中 3 个调用外部 api 来获取随机数据:
def get_external_data(zip_code, info_code):
data_url = MY_ENDPOINT_1.format(zip_code)
data_response = requests.request(
'GET',
url=data_url,
headers={
'content-Type': 'application/json',
'info-code': info_code
}
)
return data_response
def get_info(info_code):
info_url = INFO_URL.format(info_code)
info_response = requests.request(
'GET',
url=info_url,
headers={
'content-Type': 'application/json',
'info-code': info_code
}
)
return info_response
def get_zip(zip_code):
zip_url = zip_URL.format(zip_code)
zip_response = requests.request(
'GET',
url=zip_url,
headers={
'content-Type': 'application/json',
'zip-code': zip_code
}
)
return zip_response
def get_all_data(info_cd, zip_code):
data_response = get_external_data(zip_code, info_cd)
info_response = get_info(info_cd)
zip_response = get_zip(zip_code)
return data_response, info_response, zip_response
我试图通过调用函数中使用的 3 个数据函数来实现 3 个异步concurrent.futures
调用get_all_data()
。从文档中我了解到,我们可以使用以下输入列表对一个函数进行线程化:
resp_list = list()
# Asynchronous
with ThreadPoolExecutor(max_workers=3) as executor:
thread_responses = executor.map(self.get_info, info_list)
for x in thread_responses:
resp_list.append(x)
但是,在这种特殊情况下,我将如何使用 3 个不同的函数和不同的输入来实现 3 个线程?
解决方案
您可以使用在自己的线程中进行每个调用executor.submit
,如下所示:
with ThreadPoolExecutor(max_workers=3) as executor:
data_future = executor.submit(get_external_data, zip_code, info_cd)
info_future = executor.submit(get_info, info_cd)
zip_future = executor.submit(get_zip, zip_code)
# and then collect results
results = [
f.result()
for f in (data_future, info_future, zip_future)
]
查看相关文档:https ://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Executor.submit
推荐阅读
- arrays - 如何在数组中找到总和等于或小于且更接近给定值的元素?
- node.js - 无法将 Postgres 与 NodeJS 连接(Docker Compose)
- authentication - 谷歌联合登录与 Cognito 用户池并绕过托管 UI 似乎在退出时保留了一些状态
- struct - 如何从 Rust 中的一个成员引用对象?
- mediamuxer - 使用 MediaMuxer 将第二个视频混合到独立的 .mp4
- php - 在 wordpress 中解码来自 API 的 JSON 响应
- reactjs - 从函数组件向父组件发送数据
- python - 以pythonic方式创建字典列表
- git - 当 Webhook 向 Jenkins 服务器发送请求以进行构建时,NET_ERR 从 Jenkins 服务器响应
- ruby-on-rails - 如何将 rspec 用于 sidekiq 企业定期作业?