2012-02-19 40 views
9

Tôi đang cố tạo một ứng dụng web đơn giản bằng Python trên GAE. Các ứng dụng cần phải sinh ra một số chủ đề cho mỗi yêu cầu nhận được. Đối với điều này tôi đang sử dụng thư viện luồng của python. Tôi sinh ra tất cả các chủ đề và sau đó chờ đợi chúng.Các chuỗi python GAE không thực hiện song song

t1.start() 
t2.start() 
t3.start() 

t1.join() 
t2.join() 
t3.join() 

Ứng dụng chạy tốt ngoại trừ thực tế là các luồng đang chạy serially chứ không phải đồng thời (xác nhận điều này bằng cách in dấu thời gian ở đầu/cuối phương thức run() của mỗi luồng). Tôi đã theo các hướng dẫn được đưa ra trong http://code.google.com/appengine/docs/python/python27/using27.html#Multithreading để cho phép đa luồng

app.yaml tôi trông như thế:

application: myapp 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: true 

handlers: 
- url: /favicon\.ico 
    static_files: favicon.ico 
    upload: favicon\.ico 

- url: /stylesheet 
    static_dir: stylesheet 

- url: /javascript 
    static_dir: javascript 

- url: /pages 
    static_dir: pages 

- url: .* 
    script: main.app 

Tôi chắc chắn rằng GoogleAppLauncher địa phương của tôi sử dụng python 2.7 bằng cách thiết lập con đường một cách rõ ràng trong các ưu đãi.

Chủ đề của tôi có thời gian chạy trung bình là 2-3 giây, trong đó họ thực hiện cuộc gọi mở url và thực hiện một số xử lý trên kết quả.

Tôi có làm gì sai hoặc thiếu một số cấu hình để bật đa luồng không?

Trả lời

17

Bạn có gặp vấn đề này trong máy chủ dev_appserver hoặc sau khi tải ứng dụng lên dịch vụ sản xuất không? Từ việc bạn đề cập đến GoogleAppLauncher, có vẻ như bạn có thể thấy điều này trong dev_appserver; dev_appserver không mô phỏng hành vi luồng của các máy chủ sản xuất và bạn sẽ ngạc nhiên khi thấy rằng nó hoạt động tốt sau khi bạn triển khai ứng dụng của mình. (Nếu không, thêm một bình luận ở đây.)

ý tưởng khác: nếu bạn đang chủ yếu là chờ đợi nạp url, bạn có thể chạy nhiều nạp url gọi song song bằng cách sử dụng giao diện async để URLFetch: http://code.google.com/appengine/docs/python/urlfetch/asynchronousrequests.html

Cách tiếp cận này không yêu cầu chủ đề. (Nó vẫn không đúng cách song song các yêu cầu trong dev_appserver; nhưng nó không làm đúng việc trên các máy chủ sản xuất.)

+0

Vâng tôi chỉ gặp sự cố khi cài đặt cục bộ của mình. Các chuỗi chạy song song khi tôi tải lên ứng dụng của mình. Cảm ơn đã giúp đỡ. – Nitesh

1

Ghi chú đa luồng cho GAE chỉ đơn thuần là cách xử lý các yêu cầu - về cơ bản chúng không thay đổi cách các luồng Python hoạt động. Cụ thể, lưu ý "Chi tiết thực hiện CPython" trong số threading module docs vẫn được áp dụng.

Nó cũng đáng nói các lưu ý trong "Sandboxing" của các tài liệu GAE:

Lưu ý rằng chủ đề này sẽ được sự tham gia của bộ thực thi khi yêu cầu kết thúc, nên đề có thể không chạy qua cuối cùng của yêu cầu.

+0

Cảm ơn Nick đã trả lời. Vì vậy, không hỗ trợ đa luồng trong GAE ngụ ý rằng GAE có thể sinh ra nhiều luồng để xử lý các yêu cầu song song, nhưng bản thân mã ứng dụng không thể sinh ra các chuỗi trình trợ giúp? – Nitesh

+0

@Nitesh: Mặt trước mà bàn tay yêu cầu bạn có khả năng sinh ra nhiều phiên bản ứng dụng của bạn để xử lý các yêu cầu đó, tuy nhiên các chủ đề bạn tạo trong mỗi cá thể vẫn bị ràng buộc bởi các quy tắc thông thường. Tất nhiên bạn có thể chạy các trình trợ giúp đẻ trứng, nhưng chúng sẽ không chạy đồng thời trừ khi chúng đang chặn I/O. –

+0

Trong các chủ đề trợ giúp, tôi đang thực hiện một cuộc gọi urllib.urlopen. I/O cuộc gọi này có bị chặn không? – Nitesh

0

Nếu chủ đề của bạn chủ yếu chờ các hoạt động kho dữ liệu, bạn có thể thử mô-đun NDB là một phần của 1.6.2. Các ngữ nghĩa sẽ đủ gần với những gì bạn đang làm.

IIRC, cờ đa luồng cho phép một cá thể máy chủ phân phối nhiều yêu cầu trên các chuỗi riêng biệt, nhưng sẽ không cho phép bạn tự khởi động chủ đề. Nếu bạn không cần phải đồng bộ hóa chúng trước khi trở về, bạn có thể đặt chúng trên riêng biệt tasks và ủy quyền chúng cho một hoặc nhiều hàng đợi công việc.

+2

Thực ra, thời gian chạy Py27 không cho phép tạo chuỗi. (Nhưng hãy xem ghi chú được thêm vào trong câu trả lời đầu tiên ở trên - chúng sẽ được kết hợp khi yêu cầu kết thúc.) –

+0

Cảm ơn bạn đã sửa, và cho lời khuyên tốt hơn nhiều so với tôi. – rbanffy

+0

Có một tính năng mới được gọi là "chủ đề nền", giống như chủ đề thông thường, ngoại trừ chủ đề nền không được tham gia hoàn toàn vào cuối yêu cầu: https://developers.google.com/appengine/docs/python/backends/background_thread – allyourcode

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