【问题标题】:How to handle threads in Python functions in Google Cloud Functions? [closed]如何在 Google Cloud Functions 中处理 Python 函数中的线程? [关闭]
【发布时间】:2019-05-12 19:51:33
【问题描述】:

我正在使用 Google Cloud Functions 来运行我的 Facebook Messenger 机器人正在点击的 Python 函数。 Facebook Messenger 有一个奇怪的要求:

当您收到 webhook 事件时,您必须始终返回 200 OK HTTP 响应。 Messenger 平台将每 20 秒重新发送一次 webhook 事件,直到收到 200 OK 响应。未能返回 200 OK 可能会导致您的 webhook 被 Messenger 平台取消订阅。

换句话说,我有 20 秒的时间从我的云函数返回 200 OK 响应。问题是我需要使用requests.post 将我从消息中收到的数据实际发送到另一个 API,并且基本上不能保证它会花费不到 20 秒。所以理想情况下,我想使用线程和多处理。我意识到谷歌不允许线程。有什么办法可以处理这种情况?谢谢。

【问题讨论】:

  • 这个问题是一个很好的编程问题。您必须了解您的设计要求才能编写代码。为什么在不提供反馈的情况下投反对票?如果要关闭此问题,请提供一些输入,以便黑马可以编写改进的问题。我想看看这个问题的最佳答案。

标签: python google-cloud-functions


【解决方案1】:

如果我理解正确,我们有一个原始的 REST 调用者 (Facebook),需要在 20 秒或更短的时间内做出响应。但是,处理请求的函数希望调用可能需要超过 20 秒才能响应的服务。一种可能的解决方案是意识到原始 Cloud Function 发送的响应甚至可以在该 Cloud Function 中的代码逻辑完成之前返回。假设您在 Node.js 中进行编码,您会收到一个响应对象到 Cloud Function。您可以在 Cloud Function 主体中调用此对象的 send() 和 end(),然后 然后 继续执行其他长时间运行的工作。如果您想将整个过程的成功标准返回给原始呼叫者,听起来我们的故事相互矛盾。合同似乎规定响应时间必须为 20 秒或更短,而工作可能需要 20 秒以上。因此,您不能明智地返回指示在所有情况下都有完整结果的响应。

如果您正在使用 Python 编写应用程序,那么事情就不那么容易了。利用 Python 的 Cloud Functions 基于 flask 并使用烧瓶调用 Python 函数(由您提供)。此函数返回的数据是返回给调用者的数据。如果我们想早点回来然后做额外的工作,一个食谱被描述为here。不幸的是,我们似乎无法利用这个故事,因为 Cloud Functions 拥有并管理 Flask 环境,而我们没有合法的方式来添加额外的处理程序。

我想到的另一个想法是让 Facebook 调用的 Python 代码现在在 Cloud Functions 中运行,执行 Google Pub/Sub 发布请求,传递您需要传递的数据。此发布将立即返回,然后您可以快速从您的 Cloud Function 返回并满足原始请求。然后可以使用发布的消息来触发第二个云功能,该功能可能需要尽可能长的时间才能完成。

还有一个想法是根本不使用 Cloud Functions。您使用 Cloud Functions 来实现无服务器编码并且不必担心扩展问题的可能性很高。一个新功能(从 Next 19 开始)现在可用,称为 Cloud Run,它允许您创建一个 Docker 容器,该容器可以运行您自己的 Flask python 应用程序,然后您可以完全控制环境。似乎我们所拥有的是一种权衡。我们有 Cloud Functions,它为处理绝大多数 REST 请求提供了一种超快速的机制……但是,如果我们需要专业化(必须在 20 秒或更短的时间内响应并进行后续工作),那么 Cloud Functions 可能已经提示如果我们想要实现一些自定义处理,这将成为一个障碍。

【讨论】:

  • 这很有趣。是的,我不能明智地返回表明完整结果的响应。但是,我正在使用 Python 进行编码,那么 Python 的 send() 和 end() 方法是什么?
  • 添加了关于 Python 和其他替代方案的想法。
  • 您的建议非常好。我的输入:Cloud Functions 是错误的方法 - HTTP 返回结束函数执行。 Cloud Run 也是错误的方法,因为 CPU 在 HTTP 请求之间空闲到零。如果目标是无服务器,这是 App Engine Standard 或 Firebase 的任务。 App Engine Flex 是另一种很好的非无服务器方法。
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 2017-11-29
  • 2021-07-25
  • 2021-01-25
  • 2019-10-21
  • 1970-01-01
  • 2020-01-05
  • 2021-12-26
相关资源
最近更新 更多