2012-11-07 27 views
7

Tôi đang sử dụng Python GAE 2.7 với máy chủ phát triển cục bộ. Tôi đã định cấu hình chương trình phụ trợMáy chủ phát triển Python của Máy ứng dụng + Công cụ + Phụ trợ

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

và tôi đang sử dụng giá trị mặc định. Tất cả mọi thứ hoạt động tốt và backend và taskqueue có thể nhìn thấy tại bảng điều khiển SDK. Ngoài ra công tác phát triển địa phương bắt đầu mà không cần bất kỳ lỗi:

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] 

NHƯNG nếu tôi cố gắng giải quyết các backend qua một nhiệm vụ

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

lỗi này đặt ra:

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 

Tôi đang sử dụng 'localhost' và không thể thấy bất kỳ lý do nào khiến nó không thành công. Một số ý tưởng/giải pháp? Bất kỳ tham số khởi động nào bị thiếu hoặc đôi khi như thế?

Cảm ơn

+0

Bạn có thể chỉnh sửa câu lệnh 'taskqueue.add' của mình không? – bossylobster

+0

Tất nhiên tôi có thể thực hiện tuyên bố mà không có bất kỳ "mục tiêu" nào, nó đang chạy mà không có bất kỳ lỗi nào. Nhưng mục tiêu của tôi là thực hiện trên máy chủ phụ trợ :-) – user1806561

+0

Cùng một vấn đề ở đây. –

Trả lời

8

Đó là một lỗi trong taskqueue.py, nó bỏ sót một trường hợp để phân biệt giữa sản xuất và môi trường phát triển.

Trong quá trình sản xuất, nó hoạt động đúng cách bằng cách ghép nối target với hostname.

Trong quá trình phát triển, điều đó không hiệu quả và sẽ tạo ra lỗi bạn báo cáo khi cố gắng giải quyết địa chỉ worker.localhost.

Thay vào đó, nên đặt máy chủ nhiệm vụ thành máy chủ dev232_1 ip:port đang chạy chương trình phụ trợ.

Đã có bug trong bộ theo dõi vấn đề công khai đã được chuyển đến nhóm kỹ thuật.

Hãy thoải mái gắn dấu sao nếu bạn muốn được thông báo về các bản cập nhật.

+0

Vì vậy, bất kỳ sửa chữa cho điều đó? Hoặc chúng ta không thể phát triển nữa trên máy chủ dev? –

+0

Bạn nên gắn dấu sao http://code.google.com/p/googleappengine/issues/detail?id=5105 để được thông báo về cập nhật liên quan đến vấn đề này. – proppy

+0

@JimmyKane, vui lòng xem bên dưới một giải pháp nhỏ giúp tôi gỡ lỗi các dịch vụ phụ trợ cục bộ. –

1

Có một workaround đó giúp tôi gỡ rối tại địa phương:

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

Trong trường hợp này, nếu chúng ta gỡ lỗi tại địa phương, chúng tôi chạy về công việc trong hàng đợi nhiệm vụ thường xuyên. Nếu chúng ta đặt mã này vào App Engine, nó sẽ bắt đầu nhiệm vụ bằng cách sử dụng một máy chủ phụ trợ.

+0

Bạn có chỉ định số PORT sử dụng câu lệnh if này không? – Andrew

+0

@Andrew, không, tôi không chỉ định bất kỳ số cổng nào. –

+0

Trong trường hợp đó, tôi không hoàn toàn hiểu được giải pháp. Trong ví dụ trên, nhiệm vụ vẫn sẽ được chuyển đến cổng 80 (ngược với 8080). Tôi mặc dù bạn đã xác định cổng thông qua mục tiêu = 'localhost: 8080', nhưng bạn không dùng cách tiếp cận này ... Tôi đoán tôi không hiểu làm thế nào "taskqueue.add (url = '/ task', params = { ...}) "giải quyết vấn đề này. – Andrew

Các vấn đề liên quan