App Engine Python开发服务器+ Taskqueue +后端

时间:2012-11-07 15:42:02

标签: python google-app-engine

我正在使用GAE Python 2.7和本地开发服务器。我配置了一个后端

backends:
- name: worker
  class: B1
  options: dynamic

我正在使用默认的taskqueue。一切正常,后端和任务队列在SDK控制台上可见。本地开发工作也开始没有任何错误:

Multiprocess Setup Complete:
Remote API Server [http://localhost:9200]
App Instance [http://localhost:9000]
Backend Instance: worker.0 [http://localhost:9100]
Backend Balancer: worker [http://localhost:9199]

但是如果我尝试通过任务解决后端

taskqueue.add(url='/xyz', method='POST', target='worker', params={'a':'b'})

此错误引发:

ERROR An error occured while sending the task "task1" (Url: "/backend/languages/create_database/") in queue "default". Treating as a task error.
Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/taskqueue/taskqueue_stub.py", line 1884, in ExecuteTask
    connection.endheaders()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 937, in endheaders
    self._send_output(message_body)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 797, in _send_output
    self.send(msg)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 759, in send
    self.connect()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 740, in connect
    self.timeout, self.source_address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 553, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
gaierror: [Errno 8] nodename nor servname provided, or not known

我正在使用'localhost',看不出它失败的原因。一些想法/解决方案?任何启动参数缺失或类似的东西?

由于

2 个答案:

答案 0 :(得分:8)

这是taskqueue.py中的一个错误,它错过了区分生产和开发环境的案例。

在制作中,通过将targethostname连接来做正确的事。

在开发过程中,这不起作用,并且会在您尝试解析worker.localhost地址时产生您报告的错误。

相反,它应该将任务主机设置为ip:port dev_appserver正在运行后端。

公共问题跟踪器中已有bug已升级到工程团队。

如果您想收到有关更新的通知,请随意加注星标。

答案 1 :(得分:1)

有一种解决方法可以帮助我在本地进行调试:

if os.environ['SERVER_SOFTWARE'].startswith('Development'):
    taskqueue.add(url='/task', params={...})
else:    
    taskqueue.add(url='/task', params={...}, target='backendservername')

在这种情况下,如果我们在本地调试,我们在常规任务队列中运行任务。如果我们将此代码放入App Engine,它将使用后端服务器启动任务。