Іноді потрібно почати відправляти дані клієнту прямо в процесі генерування частин цих даних. В особливих випадках потрібно постійно відправляти дані до тих пір, поки клієнт не закриє з'єднання. Ви можете використовувати метод stream замість написання власних "обгорток".
Почнемо з класичного прикладу з документації Sinatra:
get '/' do
stream do |out|
out << "It's gonna be legen -\n"
sleep 0.5
out << " (wait for it) \n"
sleep 1
out << "- dary!\n"
end
end
Якщо сервер не підтримує стрімінг (наприклад, WEBRick), то всі дані будуть відправлені за один раз відразу після того, як блок, переданий в stream, завершиться.
Це дозволяє вам реалізувати потокові API, Server-Sent Events, і може служити основою для WebSockets. Також такий підхід можна використовувати для збільшення продуктивності у випадку, коли якась частина контенту залежить від повільного ресурсу.
І що дійсно цікаво: якщо ви працюєте на потоковому(evented) сервері, наприклад Thin, ви можете тримати з'єднання відкритим і легко реалізувати обмін повідомленнями.
Якщо метод stream використовується з параметром keep_open, то він не буде викликати close в об'єкта потоку, що дозволить вам закрити його пізніше в будь-якому іншому місці.
Приклад простого чату:
https://gist.github.com/2551354
Немає коментарів:
Дописати коментар