Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: Continuation 945

Ruby căn bản
phananhvu.myopenid.com 125
Updated over 5 years ago
Continuation có thể được ví như khả năng “save” khi chơi games vậy. Khi chơi games, bạn có thể save lại để yên tâm quyết đấu với con trùm. Nếu nhỡ không may mà chết thì chỉ cần load lại là xong. Nói cách khác, continuation ghi lại trạng thái của hệ thống (dưới dạng stack), và sau đó có thể dễ dàng quay trở lại.

Trong bài này, mình xin giới thiệu về continuation trong Ruby và sơ lược về continuation server.

  • Continuation trong Ruby:

Cú pháp của Ruby gọn gàng, xúc tích, giúp developer có thể triển khai continuation khá dễ dàng. Thêm nữa, Ruby có thể là ngôn ngữ triển vọng để xây dựng các continuation server trong tương lai.

Ta xét ví dụ 1: Khi i bằng 7 thì Ruby gọi hàm continuation.call và thoát khỏi vòng lặp.

callcc do |continuation|
  for i in 1..10 do
    continuation.call if (i = = 7)
    puts i
  end
  puts 'This never happens.'
end
puts 'Good bye.'

Output:

ruby forloop.rb 1 2 3 4 5 6 Good bye.

Biết rằng continuation trả về call stack và các biến trong block y nguyên như lúc bạn tạo ra. Trong ví dụ hai, ta đưa continuation ra ngoài block, đặt trong một hàm. Kết quả thu được khá thú vị !

def loop
  for i in 1..5 do
    puts i
    callcc {|continuation| return continuation} if (i = = 2)
  end           # cont.call returns here
  return nil
end
puts "Before loop call" 
cont=loop( )
puts "After loop call" 
cont.call if cont
puts "After continuation call"

Output:

ruby continuation.rb Before loop call 1 2 After loop call 3 4 5 After loop call After continuation call

Đoạn chương trình này cũng không khó lắm. Khi i bằng 2, chúng ta thoát ra khỏi vòng lặp để rồi sau đó, quay trở lại, cũng tại vị trí đó của i. Trong ví dụ trên, trạng thái của chương trình được lưu trong đối tượng cont.

  • Continuation server:

Nếu một web server có khả năng continuation thì sao? Trong khi chờ user input, web server có thể lưu trạng thái đó vào một đối tượng continuation, và quay trở lại trạng thái đó sau một khoảng thời gian. Ứng dụng web giờ đây, là chuỗi các cặp request/response không phải được tạo ra bởi user nữa mà được quản lí bởi server. Do đó, server code sẽ trở nên đơn giản hơn rất nhiều. Cool !

Continuation server trở thành tập hợp các ứng dụng web có các trạng thái ở từng thời điểm được lưu dưới dạng continuation. Mỗi user ứng với một session được gán ID. Sau mỗi request, continuation server lưu lại trạng thái hiện tại trong một đối tượng continuation tương ứng với session. Như vậy là: server quản lí nhiều session, mỗi session có một hoặc hơn các continuation ứng với các thời điểm khác nhau (như trong hình trên)

Với continuation server, ta có thể đóng gói nhiều web screen vào trong một method (nhờ đó có thể thực thi các page flows phức tạp với công sức bỏ ra ít hơn), các rắc rối do tính stateless của http connection, vấn đề back button, ... cũng được giải quyết rất dễ dàng.

Hiện tại có thể kể đến một số continuation server như: Cocoon Flow (viết bằng Java), Seaside (SmallTalk), PLT Scheme, Sisc scheme. Trong tương lai, với ưu điểm của mình, chắc chắn những ngôn ngữ như Ruby sẽ được chọn để phát triển những continuation server. Có thể đó sẽ là một project của VnRuby chăng (:P).

Tham khảo:

Comments

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content