2013-07-11 22 views
14

Tôi có một câu hỏi, có thể Django làm công việc đa luồng? Dưới đây là những gì tôi muốn làm: bấm vào một nút trên một trang web, sau đó có một số chức năng trong model.py bắt đầu chạy, ví dụ, thu thập dữ liệu một số dữ liệu từ internet, khi kết thúc, nó sẽ trả về cho người dùng các kết quả.Django có thể hoạt động đa luồng không?

Tôi tự hỏi rằng tôi phải mở một chuỗi mới để thực thi các hàm trong model.py, bất kỳ ai cũng có thể cho tôi biết cách thực hiện? Cảm ơn nhiều.

+0

Bạn đang cố gắng để hoàn thành ? có lẽ bạn có thể làm điều đó bằng cách thêm vào các tecnology như AJAx, WebSocket, ma thuật pony ... – gipi

+0

Con ngựa kỳ diệu là gì? Không thể tìm thấy nó trên google ... –

Trả lời

9
  1. Có thể có nhiều chủ đề, nhưng thường sử dụng Celery để thực hiện tương đương. You can read about how in the celery-django tutorial.
  2. Hiếm khi bạn thực sự muốn buộc người dùng phải đợi trang web. Trong khi nó tốt hơn so với rủi ro một thời gian chờ.

Đây là ví dụ về những gì bạn mô tả. cách

User sends request 
Django receives => spawns a thread to do something else. 
main thread finishes && other thread finishes 
... (later upon completion of both tasks) 
response is sent to user as a package. 

tốt hơn:

User sends request 
Django receives => lets Celery know "hey! do this!" 
main thread finishes 
response is sent to user 
...(later) 
user receives balance of transaction 
+58

Cần tây là quá mức cần thiết cho nhiều mục đích. Vui lòng ngừng đề xuất nó làm dấu đầu dòng ma thuật cho bất kỳ thứ gì không cần chặn yêu cầu/phản hồi. Nó giống như giới thiệu một RDBMS bất cứ khi nào có ai hỏi làm thế nào để lưu trữ một dòng văn bản. –

+5

@andybak Vui lòng đề xuất một giải pháp thay thế. Đối với tôi, điều này nghe có vẻ giống như sử dụng hợp pháp. – cwallenpoole

+4

phụ thuộc vào các chi tiết cụ thể nhưng bạn có thể chỉ tạo một chuỗi và thăm dò để hoàn thành, bạn có thể sử dụng một công việc cron đơn giản để kiểm tra các tác vụ hoặc nếu bạn cần nhiều tính năng hơn, bạn có thể sử dụng một vài tính năng 'không phức tạp như cần tây' các dự án như huey hoặc django-background-tasks. –

0

Nếu bạn không muốn thêm một số khuôn khổ quá mức cần thiết để dự án của bạn, bạn chỉ có thể sử dụng subprocess.Popen:

def my_command(request): 
    command = '/my/command/to/run' # Can even be 'python manage.py somecommand' 
    subprocess.Popen(command, shell=True) 
    return HttpResponse(status=204) 
Các vấn đề liên quan