我正在与tornado和官方python oauth2client、gcloud...模块进行斗争。
这些模块接受通过 http= 传递的备用 http 客户端,只要它有一个名为 request
的方法,无论何时,任何这些库都可以调用该方法。必须将 http 请求发送到 Google 和/或使用刷新 token 更新访问 token 。
我创建了一个简单的类,其中有一个 self.client = AsyncHttpClient()
然后在其 request
方法中,返回 self.client.fetch(...)
我的目标是能够产生
任何这些库调用,以便tornado能够异步执行它们。
问题是它们高度依赖于默认客户端设置为 httplib2.Http() 返回的内容:(响应,内容)
我真的陷入困境,无法找到一种干净的方法来实现异步
如果有人已经找到方法,请帮忙。
提前谢谢
最佳答案
这些库不支持异步。移植过程并不总是那么容易。
oauth2client
取决于你想做什么,也许 Tornado's GoogleOAuth2Mixin
或tornado-alf就足够了。
gcloud
由于我不知道 gcloud-python
有任何 Tornado/asyncio 实现,因此您可以:
你可以自己写。同样,这不是
Connection.http
或request
的简单传输更改,周围的所有内容都必须能够使用/产生 future /协程。将其包装在
ThreadPoolExecutor
中(正如@Apero提到的)。这是高级 API,因此该 yield 中的任何嵌套 api 调用都将在同一线程中执行(不使用池)。它可以很好地工作。外部应用(使用
ProcessPoolExecutor
或Popen
)。
几年前,当我在 AWS 上遇到类似问题时,我最终以异步方式执行 CLI(Tornado + subprocess.Popen + 一些 cli(awscli 或基于 boto))和简单案例(例如 S3、基本 EC2 操作) )与普通的 AsyncHTTPClient。
关于Python oauth2client 异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35996377/