2011-01-12 35 views
5

hi
Tôi sẽ thiết lập một trang web đường ray, sau một số đầu vào người dùng ban đầu, một số phép tính nặng được thực hiện (thông qua c-extension thành ruby, sẽ sử dụng đa luồng). vì những tính toán này sẽ tiêu thụ gần như tất cả thời gian cpu (bộ nhớ quá), nên không bao giờ có nhiều hơn một phép tính chạy cùng một lúc. tôi cũng không thể sử dụng các công việc nền (không đồng bộ) (như với công việc bị trì hoãn) vì đường ray phải hiển thị kết quả của phép tính đó và trang web sẽ hoạt động mà không có javascript.
vì vậy tôi cho rằng tôi cần một quá trình riêng biệt trong đó tất cả các trường hợp đường ray phải xếp hàng các yêu cầu tính toán của họ không phải chờ câu trả lời (có thể là thông báo lỗi nếu hàng đợi đầy), loại trình quản lý công việc đồng bộ.Ruby/Rails quản lý công việc đồng bộ

có ai biết nếu có đá quý/plugin có chức năng như vậy không? (nanite dường như khá thú vị đối với tôi, nhưng dường như chỉ là không đồng bộ, vì vậy các trường hợp đường ray sẽ không biết khi nào việc tính toán kết thúc. Có đúng không?)
ý tưởng khác là viết của riêng tôi bằng cách sử dụng phân phối ruby ​​(drb), nhưng tại sao lại phát minh ra bánh xe nếu nó đã tồn tại?

bất kỳ trợ giúp nào sẽ được đánh giá cao!

EDIT: vì mẹo của zaius tôi nghĩ rằng tôi sẽ có thể thực hiện việc này một cách không đồng bộ, vì vậy tôi sẽ thử resque.

Trả lời

5

Ruby có mutexes/semaphores.

Bạn có thể sử dụng một semaphore để đảm bảo chỉ có một nguồn tài nguyên quá trình chuyên sâu đang xảy ra cùng một lúc.

Tuy nhiên, ý tưởng về một quá trình chặn cuối trước khi kết thúc nhiệm vụ khác có vẻ không đúng với tôi.Nếu tôi đã làm điều này, tôi sẽ sử dụng một nhân viên nền, và sau đó sử dụng một trang (hoặc một khung nội tuyến) với thẻ meta làm mới để liên tục kiểm tra tiến độ.

Bằng cách đó, bạn có thể sử dụng cùng mã cho cả kích hoạt javascript và khách hàng khuyết tật. Và chuỗi ứng dụng web của bạn không chặn.

+0

rằng điều metarefresh sẽ là có thể, nhưng có người sử dụng để tải lại trang theo cách thủ công nếu tính toán không được hoàn thành sau khi làm mới không quá thân thiện trong mắt tôi. atm tôi không mong đợi quá nhiều yêu cầu cùng một lúc, do đó, chặn các chủ đề web không phải là một mối quan tâm lớn. nhưng bạn nói đúng, đó không phải là cách hay để làm điều đó. – user573335

+0

Bạn có thể thực hiện làm mới meta bao nhiêu lần tùy thích - nếu công việc không hoàn tất sau lần làm mới đầu tiên, hãy hiển thị cho họ trang làm mới giống nhau và chỉ hiển thị trang cuối cùng khi công việc được thực hiện. – zaius

+0

tốt, tôi là một chút do dự về nó, nhưng tôi càng nghĩ về nó càng có vẻ như giải pháp tốt hơn để làm điều đó một cách không đồng bộ, ít nhất là về lâu dài. có hàng đợi công việc mà tôi có thể hỏi về thời gian nhiệm vụ dự kiến ​​(từ một chuỗi web) và có thể trả về một thông báo lỗi cho chuỗi web nếu có quá nhiều công việc xếp hàng không? – user573335

1

Nếu bạn có một quá trình riêng biệt, sau đó bạn có một công việc nền ... do đó, hoặc bạn có thể có nó hoặc bạn có thể không ...

Những gì tôi đã làm là có trang web viết params yêu cầu vào cơ sở dữ liệu. Sau đó, một quá trình riêng biệt tìm kiếm các yêu cầu đang chờ xử lý trong cơ sở dữ liệu - sử dụng đá quý daemons. Nó thực hiện công việc và ghi kết quả trở lại cơ sở dữ liệu.

Trang web sau đó thăm dò ý kiến ​​cơ sở dữ liệu cho đến khi kết quả đã sẵn sàng và sau đó hiển thị chúng.

Mặc dù tôi sử dụng javascript để làm cho nó thực hiện bỏ phiếu.

Nếu bạn thực sự không thể sử dụng javascript, thì có vẻ như bạn cần phải thực hiện công việc trong chuỗi yêu cầu web hoặc làm cho chuỗi đó chờ chuỗi nền hoàn thành.

Để yêu cầu chờ chuỗi yêu cầu web, chỉ cần thực hiện một vòng lặp trong đó, kiểm tra cơ sở dữ liệu cho đến khi trả lời được lưu lại vào đó. Khi đã ở đó, bạn có thể hoàn thành chuỗi.

HTH, chris

+0

ok, bạn có biết làm thế nào tôi có thể làm cho chuỗi yêu cầu web chờ công việc nền kết thúc? kể từ khi chủ đề web reuest không thể sinh ra các chủ đề nền, tôi không biết làm thế nào để làm điều đó. – user573335

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