2010-06-10 28 views
31

Vì vậy, tôi đang viết một daemon dựa trên Twisted khác. Nó sẽ có một giao diện xmlrpc như bình thường vì vậy tôi có thể dễ dàng giao tiếp với nó và có các quá trình trao đổi dữ liệu khác với nó khi cần thiết.Twisted + SQLAlchemy và cách tốt nhất để làm điều đó

Daemon này cần truy cập cơ sở dữ liệu. Chúng tôi đã sử dụng thuật toán SQL Alchemy thay cho các chuỗi SQL mã hóa cứng cho các dự án mới nhất của chúng tôi - những dự án chủ yếu được thực hiện cho các ứng dụng web trong giá treo.

Chúng tôi muốn làm tương tự cho ứng dụng này và sử dụng lại mã thư viện sử dụng thuật toán SQL Alchemy. Vậy lam gi? Tất nhiên, kể từ khi thư viện được viết để sử dụng trong ứng dụng giá treo, đó là tất cả mã kiểu chặn thẳng về phía trước mà mọi người quen thuộc và tất cả không bị chặn được xử lý một cách kỳ diệu bởi giá treo thông qua luồng, người dân địa phương, phiên scoped và trên.

Vì vậy, bây giờ cho Twisted tôi đoán tôi là một chút khó khăn. Tôi có thể:

  1. Chỉ cần viết sql Tôi cần trực tiếp nếu nó tối thiểu và sử dụng hồ bơi dbapi xoắn để làm runInteractions vv khi tôi cần nhấn db.
  2. Sử dụng các đối tượng và các phương pháp chặn vốn có trong thư viện của chúng tôi và chặn ngay bây giờ và sau đó trong daemon Xoắn của tôi. Bah.
  3. Sử dụng sAsync được cập nhật lần cuối vào năm 2008 và sử dụng lại các mô hình chúng tôi đã xác định nhưng không thực sự và điều này không giải quyết rằng mã thư viện cũng cần phải hoạt động trong giá treo. Điều đó thậm chí làm việc với phiên bản mới nhất của SQL Alchemy? Ai biết. Dự án đó trông thật tuyệt vời - tại sao nó lại bị bỏ rơi?
  4. Sinh ra một tiến trình con riêng biệt và xử lý mã thư viện và tất cả nó chặn, kết quả được trả lại cho daemon của tôi khi sẵn sàng như đối tượng được khắc phục thông qua YAML trên xmlrpc.
  5. Sử dụng trì hoãnToThread và sau đó xóa các đối tượng được trả lại khi đã đảm bảo thực hiện các tải mong muốn để tôi có tất cả nội dung mà tôi có thể cần. Có vẻ như ugha với tôi.

Tôi cũng bị mắc kẹt bằng cách sử dụng Python 2.5.4 atm vì vậy chưa có 2.6 và tôi không nghĩ mình có thể thực hiện nhập từ tương lai để truy cập vào các công cụ mô-đun đa xử lý mới trong đó. Đó là OK mặc dù tôi đoán là chúng tôi đã có giao dịch với truyền thông interprocess xuống khá tốt.

Vì vậy, tôi đang hướng tới tùy chọn 4 chủ yếu vì điều đó sẽ tránh được tội lỗi chết người của sự sao chép logic với tùy chọn 1 trong khi vẫn ở cách xa chủ đề.

Nỗ lực đầu tiên của tôi sẽ là tùy chọn 2 để thực hiện điều này và sau đó tách các cuộc gọi sang mã thư viện có thể thành một quá trình riêng biệt, có vẻ như có thể mất quá nhiều thời gian để chặn. Buồn. Có lẽ một sự kết hợp của Stackless Python và Twisted sẽ rất thú vị ở đây.

Bất kỳ ý tưởng nào tốt hơn?

Trả lời

5

Thứ nhất, tôi rất tiếc, chỉ có ý kiến ​​thứ hai của bạn là bị xoắn và SQLAlchemy không phát cùng lúc. Tôi đã làm việc một số với cả hai và sẽ có phần sợ phức tạp mà có thể phát sinh từ đặt chúng lại với nhau.

Tất cả các lớp tích hợp cơ sở dữ liệu mà tôi biết đến ngày sử dụng xoắn lớp tích hợp luồng, và nếu bạn muốn tránh điều đó tại tất cả chi phí bạn đang mắc kẹt với điểm 4 trong danh sách của bạn.

Mặt khác, tôi đã thấy các ví dụ về mã kết nối cơ sở dữ liệu sử dụng deferToThread() và bạn bè hoạt động rất tốt.

Dù sao, một số gợi ý nếu bạn muốn được sẵn sàng xem xét các khuôn khổ khác hơn SQLAlchemy:

Những kẻ DivMod đã và đang làm một số công việc thăm dò trên xoắn - tích hợp cơ sở dữ liệu dựa trên Storm ORM (google cho " bão orm ").

Xem liên kết này cho một ví dụ:

http://divmod.readthedocs.org/en/latest/products/nevow/storm-approach.html

Ngoài ra, đứng đầu trên trang web DivMod và có một cái nhìn tại các nguồn lớp Axiom db của họ (có thể là không sử dụng bất kỳ để bạn trực tiếp từ chỉ là Sqlite, nhưng nguyên tắc có thể hữu ích).

+0

Cảm ơn Jacob - Tôi đã thử Storm trước mùa thu trước khi chọn cho SQL Alchemy. Việc chèn dữ liệu không được chấp nhận chậm với Storm tại thời điểm đó. Có lẽ đó không còn là vấn đề nữa - đã lấy từ 2 đến 3 giây cho mỗi lần chèn vào MySQL cho một trong các bảng của chúng tôi. Tôi cũng đã sử dụng runInteration và runQuery trong twisted với các công cụ kết nối của họ và nó hoạt động tốt. Vấn đề là tôi cũng muốn nó hoạt động trong thế giới Pylons. Vì vậy, điều tiếp theo để xem xét là [Eventlet] (http://eventlet.net/) và [gevent] (http://www.gevent.org/) Sau này được cho là nhanh hơn/tốt hơn nhưng không đi với Twisted . – Khorkrak

+0

Liên kết không hoạt động. Phải không? http://divmod.readthedocs.org/en/latest/products/nevow/storm-approach.html –

+0

Cảm ơn! Đã cập nhật với liên kết mới. –

6

Có một nhánh bão mà bạn có thể sử dụng với xoắn trực tiếp (nội bộ nó sẽ trì hoãn công cụ luồng) trên bảng khởi chạy https://code.launchpad.net/~therve/storm/twisted-integration. Tôi đã sử dụng nó độc đáo.

sqlalchemy đáng buồn là phức tạp hơn nhiều trong việc triển khai để kiểm tra việc sử dụng không đồng bộ. Nếu bạn thực sự muốn sử dụng nó, tôi muốn giới thiệu một cách tiếp cận quá trình với một lớp rpc lưu trữ.

cách khác nếu cảm giác của bạn mạo hiểm và sử dụng postgresql, các pyscopg2 mới nhất hỗ trợ đúng cách sử dụng async (https://launchpad.net/txpostgres), và là nguồn cơn bão là khá đơn giản để hack vào ;-)

tình cờ cơn bão bạn đã cố gắng hồi năm ngoái có thể không đã có phần mở rộng C theo mặc định (nó bây giờ là trong bản phát hành mới nhất.) mà có thể giải thích cho vấn đề tốc độ của bạn.

+0

Câu trả lời tốt kaplit - Tôi đã thử sử dụng chi nhánh bão liên quan đến Twisted năm ngoái và nó thực hiện công việc - nhưng chúng tôi đã chuyển sang SQL Alchemy sau đó vì chèn chậm. Vì vậy, chúng tôi đang di chuyển theo hướng thường có một daemon riêng biệt hỗ trợ một số dịch vụ dựa trên giao diện - chỉ đơn giản là xmlrpc hiện chấp nhận đơn giản args và trở về primtives như số nguyên, chuỗi hoặc dicts, danh sách vv. Trong một số trường hợp yaml cho marshalling đối tượng. – Khorkrak

3

Có lẽ Twistar là thứ bạn đang tìm kiếm. Đó là một bản ghi hoạt động bản địa (aka ORM) cho xoắn, làm việc trên đầu trang của twisted.enterprise.adbapi.

http://findingscience.com/twistar/

10

Trong vài can thiệp của năm, Alex Gaynor tạo https://github.com/alex/alchimia có thể là một kho lưu trữ trung tâm tốt hơn để thực hiện lồng ghép với SQLAlchemy và Twisted.

+1

dự án alchimia trông rất đẹp. Nhưng tại sao nó bỏ lỡ SQLAlchemy ORM? Có một số hạn chế ngăn chặn thực hiện ORM trong bệnh thiếu máu cục bộ? – Maxim

+2

Có.ORM hy vọng có thể chạy các truy vấn chặn tại các vị trí tùy ý trong quá trình thực hiện của nó, làm cho nó không thể tách biệt I/O cơ sở dữ liệu thực tế khỏi thành phần truy vấn. Trừ khi SQLAlchemy ORM thay đổi đáng kể, không chắc rằng nó sẽ có thể thực hiện tích hợp trực tiếp với nó từ Twisted. – Glyph

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