1

我正在与龙卷风和官方的 python oauth2clientgcloud ... 模块作斗争。

这些模块接受通过 http= 传递的备用 http 客户端,只要它有一个request可以被任何这些库调用的方法,每当必须将 http 请求发送到 google 和/或使用刷新更新访问令牌时令牌。

我创建了一个简单的类,self.client = AsyncHttpClient() 它的方法中有一个 Then request,返回self.client.fetch(...)

我的目标是能够yield调用这些库中的任何一个,以便 tornado 以异步方式执行它们。

问题是它们高度依赖于默认客户端 - 设置为 httplib2.Http() 返回:(响应,内容)

我真的被卡住了,找不到一种使这种异步的干净方法

如果有人已经找到方法,请提供帮助。

先感谢您

4

1 回答 1

2

这些库不支持异步。移植过程并不总是那么容易。

oauth2client

根据您想要做的事情, Tornado'sGoogleOAuth2Mixintornado-alf就足够了。

由于我不知道 Tornado/asyncio 的任何实现gcloud-python,因此您可以:

  • 你可以自己写。同样,这不是Connection.httpor的简单传输更改,request周围的所有东西都必须能够使用/产生未来/协程。

  • 将其包装起来ThreadPoolExecutor(如@Apero 所述)。这是高级 API,因此该 yield 中的任何嵌套 api 调用都将在同一个线程中执行(不使用池)。它可以很好地工作。

  • 外部应用程序(带有ProcessPoolExecutorPopen)。

几年前,当我在 AWS 上遇到类似问题时,我最终以异步方式执行 CLI(Tornado + subprocess.Popen + 一些 cli(awscli,或基于 boto))和简单案例(如 S3,基本 EC2 操作)使用普通的 AsyncHTTPClient。

于 2016-03-14T20:24:23.820 回答