2008-08-31 28 views
7

Mặc dù PythonRuby có một chuỗi hạt nhân trên mỗi trình thông dịch, chúng có khóa thông dịch toàn cầu (GIL) được sử dụng để bảo vệ cấu trúc dữ liệu có khả năng chia sẻ. Mặc dù các phần trong các languajes được viết bằng C hoặc C++ có thể được tự do luồng, nhưng điều đó là không thể với mã được giải thích thuần túy trừ khi bạn sử dụng nhiều quy trình. Cách tốt nhất để đạt được điều này là gì? Using FastCGI? Tạo một máy chủ ảo hóa cluster or a farm? Sử dụng Java tương đương của họ, JRuby và Jython?Làm cách nào để làm cho các trang web Ruby hoặc Python sử dụng nhiều lõi?

Trả lời

1

Sử dụng giao diện chạy từng câu trả lời trong một thông dịch viên riêng biệt, chẳng hạn như mod_wsgi cho Python. Điều này cho phép đa luồng được sử dụng mà không gặp phải GIL.

EDIT: Rõ ràng, mod_wsgi không còn hỗ trợ nhiều trình thông dịch cho mỗi quá trình vì idiots không thể tìm ra cách triển khai đúng mô-đun mở rộng. Tuy nhiên, nó vẫn hỗ trợ các yêu cầu đang chạy trong các quy trình riêng biệt theo kiểu FastCGI, vì vậy đó rõ ràng là giải pháp được chấp nhận hiện tại.

4

Tôi không hoàn toàn chắc chắn vấn đề nào bạn muốn giải quyết, nhưng nếu bạn triển khai ứng dụng python/django của bạn thông qua một prefork prefork MPM sử dụng apache mod_python sẽ bắt đầu một số quy trình công nhân để xử lý các yêu cầu khác nhau.

Nếu một yêu cầu cần nhiều tài nguyên, bạn muốn sử dụng nhiều lõi, hãy xem pyprocessing. Nhưng tôi không nghĩ điều đó là khôn ngoan.

4

Cách 'chuẩn' để thực hiện việc này với đường ray là chạy "gói" của các cá thể Mongrel (ví dụ: 4 bản sao ứng dụng đường ray) và sau đó sử dụng apache hoặc nginx hoặc một số phần mềm khác để ngồi trước của chúng và hoạt động như một cân bằng tải.

Đây có lẽ là cách nó được thực hiện với các khung công tác ruby ​​khác như merb vv, nhưng tôi đã không sử dụng những cá nhân đó.

Hệ điều hành sẽ xử lý việc chạy từng mong muốn trên CPU của chính nó.

Nếu bạn cài đặt mod_rails aka phusion passenger, nó sẽ bắt đầu và dừng nhiều bản sao của quy trình đường ray cho bạn, vì vậy nó sẽ kết thúc việc truyền tải trên nhiều CPU/lõi theo cách tương tự.

1

Trong Python và Ruby, chỉ có thể sử dụng nhiều lõi, là để sinh ra các quy trình mới (hạng nặng). Các đối tác Java kế thừa các khả năng của nền tảng Java. Bạn có thể ngụ ý sử dụng các luồng Java. Đó là ví dụ một lý do tại sao đôi khi (thường) Máy chủ ứng dụng Java như Glassfish được sử dụng cho các ứng dụng Ruby on Rails.

+0

Không cần phải sinh ra các quy trình mới, chỉ cần sử dụng lại chúng giữa các yêu cầu. –

+1

có, tất nhiên bạn có thể tái sử dụng một quy trình cho nhiều yêu cầu vì bạn có thể sử dụng một threadpool để tránh sinh ra một luồng cho mỗi yêu cầu. Ý tôi là bạn phải sinh ra một quá trình riêng cho mỗi lõi cần được sử dụng. – dmeister

0

Đối với Python, dự án PyProcessing cho phép bạn lập trình với các quy trình giống như bạn sẽ sử dụng chuỗi. Nó được bao gồm trong thư viện chuẩn của phiên bản 2.6 được phát hành gần đây là multiprocessing. Mô-đun có nhiều tính năng để thiết lập và kiểm soát quyền truy cập vào cấu trúc dữ liệu được chia sẻ (hàng đợi, đường ống, v.v.) và hỗ trợ cho các thành ngữ phổ biến (tức là người quản lý và nhóm công nhân).

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