2

我将 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()
4

2 回答 2

3

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

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

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

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

这是一些代码:

处理程序.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)

注册处理程序: main.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",
    })
于 2013-10-11T18:35:01.173 回答
1

您只能在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 线程语法。

于 2013-02-18T19:01:26.300 回答