Witam.
Dalej chodzi o IRC bota.
On przetwarza praktycznie non stop jakieś informacje.
I np: jeśli chcę, żeby wysyłał co jakiś czas wiadomość i dam sleep 5;
to zatrzymuje to tak jakby resztę kodu.
Na przykład taka sytuacja:
wchodzi użytkownik na kanał, bot ma go przywitać…
Żeby nie śmiecił, jeśli zbyt dużo osób wchodzi dałem mu sleep 5;
Tylko wchodzi użytkownik -> witanie -> 5 s czekania
i po 5 sekundach wita tego, który wszedł w czasie tych 5 sekund…
Przez co robi się “korek”. Jak inaczej to rozwiązać?
Żeby bot nie “pamiętał” tych co wchodzili przez te 5 sekund?
Oprócz tego, bot wszystkie dane z socketa wyświetla w oknie konsoli.
W czasie tych 5 sekund zbiera informacje ale wyświetla wszystkie dopiero po 5 sekundach.
Jak temu zaradzić?
[code=ruby]class GreetingsController
GREETING_NAP = 5 #seconds
def initialize
@last_greeting = Time.now - GREETING_NAP
end
def greet(user)
unless sleeping?
puts “Hello #{user.name}!”
@last_greeting = Time.now
end
end
private
def sleeping?
Time.now > @last_greeting + GREETING_NAP
end
end[/code]
Sorry, nazewnictwo zmiennycg pewnie kiepskie, ale jestem zmęczony
Mi się wydaje, że kolega podchodzi do tematu trochę od rufy strony.
Jeśli już musisz używać sleep, to czemu nie (na przykład) z wartością 1s i po prostu co ową sekundę zwiększać licznik i zerować go po osiągnięciu 5 (z wysłaniem copięciosekundowej wiadomości przy wyzerowaniu)?
A tak naprawdę powinieneś zaimplementować jakąś MQ, z realizacją seriami co jakiś czas (niech będzie to 5 sekund). Czyli umieszczanie zleceń w kolejce w trybie ciągłym (krótkie interwały) i ich realizacja co czas jakiś (np. 5 sekund właśnie), gdzie sleep będzie służył do “dosypiania” czasu jaki pozostał od momentu rozpoczęcia przetwarzania kolejki do tych 5 sekund.
Mniej więcej łapię o co chodzi. Dzięki za pomoc.