【问题标题】:Threads on GAE with Python 2.7 throws "FrontendsNotSupported" error使用 Python 2.7 的 GAE 上的线程引发“FrontendsNotSupported”错误
【发布时间】:2013-02-18 18:50:50
【问题描述】:

我将我在 GAE 上的应用从 Python 2.5 迁移到 Python 2.7。

Python 2.7 允许线程,我正在尝试创建一个线程以在后台发送电子邮件。这里是线程:

from google.appengine.api import background_thread
from django.core.mail import send_mail

subject = 'Hello!'
msg = '\n \n Hello World!'
sender = settings.DEFAULT_FROM_EMAIL
to = 'xx@xx.com'

t = background_thread.BackgroundThread(target=send_mail, args=[subject, msg, sender, to])
t.start()

它应该可以在 GAE 上运行,但是在我上传应用并尝试执行后,出现以下错误:

Django Version: 1.3.1
Exception Type: FrontendsNotSupported
Exception Location: /python27_runtime/python27_lib/versions/1/google/appengine/api/background_thread/background_thread.py in start_new_background_thread, line 84
Python Executable:  /python27_runtime/python27_dist/python
Python Version: 2.7.3

有人知道为什么会出现这个错误吗?


代码使用普通线程:

from threading import Thread
from django.core.mail import send_mail

subject = 'Hello!'
msg = '\n \n Hello World!'
sender = settings.DEFAULT_FROM_EMAIL
to = 'xx@xx.com

t = Thread(target=send_mail, args=[subject, msg, sender, to], kwargs={'fail_silently': False})
t.setDaemon(True)
t.start()

【问题讨论】:

    标签: multithreading google-app-engine python-2.7


    【解决方案1】:

    您可以在普通实例上使用 TaskQueue,而不是产生后端实例的成本。由于您只是在写一封电子邮件,因此您似乎不需要后端实例提供的功能和时间:

    https://developers.google.com/appengine/docs/python/taskqueue/

    使用任务队列 API,应用程序可以在 用户请求,由用户请求发起。如果一个应用程序需要执行 一些后台工作,它可以使用任务队列 API 来组织它 工作成小的、离散的单元,称为任务。该应用程序将任务添加到 稍后执行的任务队列。

    根据https://developers.google.com/appengine/docs/python/backends/,您可以在正常的免费实例上获得 10 分钟的 TaskQueue 截止日期。

    这里有一些代码:

    handlers.py

        from google.appengine.ext import webapp
        from google.appengine.api import mail
    
        class YourMail(webapp.RequestHandler):
    
          def post(self):
            body_string = self.request.get("body_string")
            mail.send_mail(
              sender="you@your-domain.appengine.com",
              to="abc@abc.com",
              subject="Your subject",
              body=body_string)
    

    注册处理程序: ma​​in.py

        #Add the handler to your WSGIApplication declaration.
        application = webapp.WSGIApplication([
          ('/example',     yourcode.AnotherModule),
          #mail handler
          ('/send_mail',   handlers.YourMail),
          ], debug=True)
    

    打电话

        from google.appengine.api.labs import taskqueue
    
        taskqueue.add(url="/send_mail", params={
          'body_string': "your body",
        })
    

    【讨论】:

    • +1,虽然这不是问题的答案,但对于提问者所面临的问题,这实际上是一个更好的解决方案。
    【解决方案2】:

    您只能在 backend 实例上运行后台线程。

    https://developers.google.com/appengine/docs/python/backends/

    后端是特殊的 App Engine 实例,它们没有请求期限、更高的内存和 CPU 限制以及跨请求的持久状态。它们由 App Engine 自动启动,可以长时间连续运行。每个后端实例都有一个用于请求的唯一 URL,您可以跨多个实例对请求进行负载平衡。

    您可以在前端实例上使用普通线程(线程),但您只能在后端使用backgroundthread

    在后端运行的代码可以启动一个后台线程,该线程可以“超过”产生它的请求。它们允许后端实例执行任意定期或计划任务,或者在请求返回给用户后继续在后台工作。

    https://developers.google.com/appengine/docs/python/backends/overview#background_threads

    它实际上在错误FrontendsNotSupported 中说,因此不支持前端。但是,您可以在前端使用“普通”python 线程语法。

    【讨论】:

    • 谢谢@Paul-c,我不知道这种差异。尽管如此,我还是编写了与从 Python 2.5 迁移到 Python 2.7 之前相同的代码,但现在无法正常工作。它不会抛出任何错误,但不会发送任何电子邮件。你知道会发生什么吗? (我用代码编辑了我的问题)
    • 对不起,没有。我还没有在 GAE 中发送电子邮件。
    • 后台线程也可以用在模块上,而不仅仅是后端(不管怎样,从 2013 年 3 月起,它们现在已经被弃用了)。
    猜你喜欢
    • 2012-11-13
    • 2021-10-19
    • 2012-09-01
    • 1970-01-01
    • 2012-08-19
    • 2015-03-05
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多