2009-10-29 25 views
6

Tôi có một trang web Django bình thường đang chạy. Ngoài ra, có một quá trình xoắn, mà lắng nghe thông báo hiện diện Jabber và cập nhật DB Django bằng cách sử dụng ORM của Django.Làm thế nào để trì hoãn một hoạt động Django DB từ trong Twisted?

Cho đến giờ nó hoạt động như tôi chỉ gọi các mô hình Django tương ứng (sau khi đã thiết lập môi trường cài đặt chính xác). Điều này, tuy nhiên, khối các ứng dụng xoắn, mà không phải là những gì tôi muốn.

Vì tôi là người mới để xoắn Tôi không biết, cách tốt nhất sẽ là truy cập vào DB Django (thông qua ORM của nó) một cách không chặn bằng cách sử dụng hoãn.

  1. trì hoãnGenerator?
  2. twisted.enterprise.adbapi? (phá vỡ ORM?)
  3. ???

Nếu thông báo hiện diện được phân tích cú pháp Tôi muốn lưu trong DB Django mà người dùng có jid_str trực tuyến/ngoại tuyến (sử dụng mô hình Django UserProfile). Tôi làm điều đó với chức năng:

def django_useravailable(jid_str, user_available): 
    try: 
     userhost = jid.JID(jid_str).userhost() 
     user = UserProfile.objects.get(im_jabber_name=userhost) 
     user.im_jabber_online = user_available 
     user.save() 
     return jid_str, user_available 
    except Exception, e: 
     print e 
    raise jid_str, user_available,e 

Hiện nay, tôi gọi nó với: "Tôi có một trang web Django bình thường chạy"

d = threads.deferToThread(django_useravailable, from_attr, user_available) 
d.addCallback(self.success) 
d.addErrback(self.failure) 
+1

Vui lòng đăng mã, đặc biệt là phần "chặn" ứng dụng của bạn. – ohnoes

Trả lời

1

Có lẽ dưới Apache sử dụng mod_wsgi hoặc tương tự.

Nếu bạn đang sử dụng mod_wsgi được nhúng trong Apache, hãy lưu ý rằng Apache là đa luồng và các chuỗi Python của bạn được trộn vào luồng của Apache. Phân tích những gì ngăn chặn có thể nhận được icky.

Nếu bạn đang sử dụng mod_wsgi ở chế độ daemon (bạn nên có) thì Django của bạn là một quá trình riêng biệt.

Tại sao không tiếp tục mẫu thiết kế này và làm cho "người nghe jabber" của bạn một quá trình riêng biệt.

Nếu bạn muốn quá trình này chạy bất kỳ một số máy chủ nào, thì hãy bắt đầu quá trình từ init.rc hoặc cron.

Vì đó là một quá trình riêng biệt, nó sẽ không cạnh tranh được. Quá trình Django của bạn chạy nhanh và trình nghe Jabber của bạn chạy độc lập.

+0

Tôi muốn có cơ hội di chuyển sự hiện diện của trình xử lý notificaiton đến máy chủ khác khi cần. Với giải pháp xử lý không dễ dàng. Hơn nữa, tôi thích đánh giá async xoắn, mà tôi nghĩ rằng có thể xử lý một lượng lớn các thay đổi thông báo. Tôi cho rằng sẽ có rất nhiều notificatinos hơn số lần truy cập trang web. –

1

Tôi đã thành công khi sử dụng phương pháp bạn mô tả làm phương pháp hiện tại của mình. Bạn sẽ tìm thấy bằng cách đọc các tài liệu mà api DB xoắn sử dụng các chủ đề dưới mui xe vì hầu hết các thư viện SQL có một API chặn.

Tôi có một máy chủ xoắn giúp lưu dữ liệu từ màn hình điện trong trường và thực hiện bằng cách khởi động một phần phụ ngay bây giờ và một lần nữa và gọi mã lưu Django của tôi. Bạn có thể đọc thêm về my live data collection pipeline (đó là liên kết blog).

Bạn đang nói rằng bạn đang bắt đầu một tiểu chủ đề và đó là vẫn còn chặn?

+0

Nhưng lý do để sử dụng xoắn là chúng tôi không _not_ muốn sử dụng chủ đề. Nếu tôi phải gắn bó với phiên bản luồng hiện tại, tôi không có lợi ích trong việc sử dụng xoắn. Sau đó tôi cũng có thể sử dụng các chủ đề từ quá trình Django trực tiếp. –

+0

Vâng, tôi cũng ghét nó vì lý do đó. Ít nhất bạn có thể đảm bảo rằng có một số giới hạn các chuỗi cơ sở dữ liệu đã bắt đầu (tức là quản lý 1000 kết nối máy khách và khéo léo gộp truy cập cơ sở dữ liệu và luồng của chúng). Việc sử dụng cơ sở dữ liệu chỉ là một phần nhỏ trong các kết nối dài hạn của tôi được quản lý bằng cách xoắn, do đó, nó không sao để tạo ra một chuỗi theo yêu cầu cho tôi. –

0

Tôi có một ứng dụng Twisted đang chạy nơi tôi sử dụng Django ORM. Tôi không trì hoãn nó. Tôi biết nó sai, nhưng vẫn chưa có vấn đề gì.

+0

Một chút không liên quan, phải không? –

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