2010-02-09 19 views
5

Có cách nào đơn giản để thực hiện async trong Perl? Tôi có logic sau cho một ứng dụng Apache:Làm cách nào để sử dụng lập trình không đồng bộ trong Perl?

get request 
process request 
write to log 
return 

những gì tôi muốn làm là để phần "viết để đăng nhập" không đồng bộ, để tôi có thể làm phần "trả lại" càng sớm càng tốt.

+1

Tại sao không sử dụng các cuộc gọi không chặn để xử lý ghi vào phần đăng nhập của tập lệnh? – daotoad

+0

Bạn có ý nghĩa gì với "ứng dụng Apache"? mod_perl? CGI? PSGI? máy chủ perl độc lập với Apache là giao diện người dùng? – dolmen

Trả lời

7

Thật không may, điều này thường đòi hỏi khuôn khổ POE, nhưng cũng có một thay thế đang phát triển (mà tôi muốn thử trước) được gọi là AnyEvent.

Xem this question for learning materials để biết thêm thông tin về việc học POE. POE là một khuôn khổ và nó có xu hướng ăn toàn bộ ứng dụng của bạn. Nó cũng không trông như Perl và nhô ra. Tôi tin rằng đó là một đường cong học tập lớn cho ứng dụng điển hình của bạn.

AnyEvent là nhiệm vụ không đồng bộ dựa trên liên tục đơn giản, bạn có thể hình dung ra khá tốt chỉ với tài liệu CPAN.

Đối với câu hỏi cụ thể của bạn, bạn sẽ sử dụng AnyEvent's AIO hoặc POE's Read Write wheel

+0

cảm ơn, đã tự hỏi nếu tôi bỏ lỡ bất cứ điều gì rõ ràng, nhưng không thể tìm thấy bất kỳ. Vì đây là một phần của một ứng dụng Apache, không phải giải pháp nào cũng hấp dẫn. thanks tho – Timmy

+2

bạn có thể sử dụng một ổ cắm không chặn đơn giản để gửi dữ liệu đến một trình ghi nhật ký POE bằng văn bản. Và, như daotoad nói, miễn là bạn đang giới hạn một quá trình viết cho mỗi tập tin thì bạn có thể chỉ cần sử dụng một chốt không chặn –

+2

AnyEvent cũng nhanh hơn và ít xâm nhập hơn POE. Từ một người sử dụng POE trước đây, và bây giờ là một người dùng AnyEvent vui vẻ. – dolmen

3

bạn có thể sử dụng bài trong perl. tạo một chuỗi xử lý nhật ký. chuỗi này sẽ có bộ đệm mà chủ đề chính có thể thêm thư vào đó

7

Xem xét xem Coro.

Từ tài liệu CPAN của nó:

Không giống như cái gọi là "Perl đề" (mà không thực sự đề thực nhưng chỉ có cửa sổ quá trình thi đua (xem phần của cùng một tên để biết thêm chi tiết) chuyển đến unix , và như hành động như các quy trình), Coro cung cấp một không gian địa chỉ được chia sẻ đầy đủ, giúp việc giao tiếp giữa các luồng rất dễ dàng. Và các chủ đề của Coro cũng nhanh chóng: vô hiệu hóa mã mô phỏng quy trình Windows trong perl của bạn và sử dụng Coro có thể dễ dàng dẫn đến tăng gấp hai đến bốn lần tốc độ cho các chương trình của bạn. Một điểm chuẩn nhân ma trận song song chạy nhanh hơn 300 lần trên một lõi đơn so với các chuỗi giả của perl trên lõi tứ sử dụng tất cả bốn lõi.

Điều này bao gồm Coro::AIO, "tệp không đồng bộ thực sự và thư mục I/O", có thể là những gì bạn đang tìm kiếm.

6

Bạn có thực sự cần viết nhật ký trước khi quay lại không?

Giả sử đây là Apache mod_perl, nó hỗ trợ trình xử lý dọn dẹp được kích hoạt cho quá trình con sau khi trả lời được trả về.

Có vẻ như những gì bạn thực sự muốn là dành cho việc ghi nhật ký không dừng trả lại, trình xử lý dọn dẹp dường như sẽ làm điều đó mà không cần đến bất kỳ đồng bộ nào.

+0

Có lẽ bạn đang đúng, nhưng đó là một thiết kế tồi ngay bây giờ, và nó cần nó để tận dụng lợi thế của thực tế là nó có một số dữ liệu ngay bây giờ, không chỉ là một đăng nhập đơn giản. – Timmy

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