2010-12-26 42 views
7

Tôi có một loạt các yêu cầu Django thực hiện một số tính toán toán học (được viết bằng C và được thực thi thông qua mô-đun Cython), có thể mất một lượng không xác định (theo thứ tự 1 giây) để thực thi. Ngoài ra các yêu cầu không cần phải truy cập vào cơ sở dữ liệu và tất cả đều độc lập với nhau và Django.Xử lý không đồng bộ Django

Ngay bây giờ mọi thứ đều đồng bộ (sử dụng Gunicorn với sync loại công nhân) nhưng tôi muốn thực hiện điều này không đồng bộ và không chặn. Nói tóm lại tôi muốn làm điều gì đó:

  1. Nhận yêu cầu AJAX
  2. Phân bổ nhiệm vụ một nhân viên có sẵn (không có ngăn chặn các ứng dụng web chính Django)
  3. Worker thực hiện nhiệm vụ trong một số lượng không rõ thời gian
  4. Django trả về kết quả của việc tính toán (một danh sách các chuỗi) như JSON bất cứ khi nào nhiệm vụ hoàn thành

tôi rất mới để đồng bộ Django, và vì vậy câu hỏi của tôi là chồng tốt nhất fo là gì r làm điều này.

Đây có phải là loại quy trình mà hàng đợi nhiệm vụ phù hợp không? Có ai khuyên bạn nên Tornado + Celery + RabbitMQ, hoặc có lẽ cái gì khác?

Cảm ơn trước!

+0

Bạn làm gì với kết quả tính toán? – sdolan

+0

Trả lại kết quả (dưới dạng JSON) cho trình duyệt của người dùng. –

Trả lời

14

Cần tây sẽ là hoàn hảo cho việc này.

Vì những gì bạn đang làm tương đối đơn giản (đọc: bạn không cần các quy tắc phức tạp về cách nhiệm vụ được định tuyến), bạn có thể thoát khỏi bằng cách sử dụng chương trình phụ trợ Redis, có nghĩa là bạn không cần thiết lập/cấu hình RabbitMQ (theo kinh nghiệm của tôi, khó hơn).

tôi sử dụng Redis với hầu hết một xây dựng dev của cần tây, và đây là các bit có liên quan của cấu hình của tôi:

 
# Use redis as a queue 
BROKER_BACKEND = "kombu.transport.pyredis.Transport" 
BROKER_HOST = "localhost" 
BROKER_PORT = 6379 
BROKER_VHOST = "0" 

# Store results in redis 
CELERY_RESULT_BACKEND = "redis" 
REDIS_HOST = "localhost" 
REDIS_PORT = 6379 
REDIS_DB = "0" 

Tôi cũng đang sử dụng django-celery, mà làm cho sự tích hợp với Django hạnh phúc.

Nhận xét nếu bạn cần thêm bất kỳ lời khuyên cụ thể nào.

+1

Ngoài ra, tôi không gặp vấn đề gì với việc sử dụng 'gevent' + khỉ vá với Celery, vì vậy nếu bạn sử dụng nhân viên gunicent' gunicorn và monkeypatch 'celery', mọi thứ chỉ nên không đồng bộ một cách kỳ diệu. –

+0

Cảm ơn lời khuyên. Tôi đã cố gắng sử dụng 'gevent' công nhân + khỉ vá trong quá khứ nhưng nó làm chậm ứng dụng của tôi để thu thập thông tin. Tôi nghi ngờ của nó do kết nối chặn của tôi với MySQL. Tôi có cần chuyển sang cơ sở dữ liệu khác không? –

+0

Xin lỗi, tôi đã không làm việc với 'gevent' và các DB khác, vì vậy tôi không thể nói. Có thể đăng một câu hỏi khác về điều đó? –

0

Vì bạn đang lập kế hoạch để làm cho nó không đồng bộ (có lẽ là sử dụng một cái gì đó như gevent), bạn cũng có thể xem xét thực hiện một dịch vụ web phụ trợ ren/chia cho công việc tính toán.

Máy chủ giao diện người dùng không đồng bộ có thể xử lý tất cả công việc nhẹ, lấy dữ liệu từ cơ sở dữ liệu phù hợp cho async (redis hoặc mysql với trình điều khiển đặc biệt), v.v. Khi tính toán phải được thực hiện, máy chủ giao diện người dùng có thể đăng tất cả nhập dữ liệu vào máy chủ phụ trợ và truy xuất kết quả khi máy chủ phụ trợ hoàn thành việc tính toán nó.

Vì máy chủ giao diện người dùng không đồng bộ, máy chủ sẽ không chặn trong khi đợi kết quả. Lợi thế của điều này trái với việc sử dụng cần tây, là bạn có thể trả lại kết quả cho khách hàng ngay sau khi nó có sẵn.

client browser <> async frontend server <> backend server for computations 
Các vấn đề liên quan