SORU
20 Mart 2009, Cuma


Ne'iyi bir oranı algoritması sınırlayıcı s?

Pseudo-code, veya daha iyi, Python kullanabilir miyim? Deniyorum konusunda hız sınırlayıcı sıra için bir Python IRC bot ve kısmen çalışır, ama eğer birisi tetikler daha az mesaj daha sınırı (örneğin, hız sınırı 5 mesaj başına 8 saniye, ve kişi tetikler sadece 4), ve önümüzdeki tetik üzerinde 8 saniye (örneğin, 16 saniye sonra), bot gönderdiği mesaj, ama sıra olur tam ve bot bekler 8 saniye bile değil gerekli beri 8 saniye süresi vardır geçmiş.

CEVAP
20 Mart 2009, Cuma


Eğer çok hızlı bir şekilde ulaştığında iletileri bırakmak istiyorsanız, burada basit bir algoritma, (yerine sıra keyfi büyük olsun, çünkü mantıklı olan, kuyruk):

rate = 5.0; // unit: messages
per  = 8.0; // unit: seconds
allowance = rate; // unit: messages
last_check = now(); // floating-point, e.g. usec accuracy. Unit: seconds

when (message_received):
  current = now();
  time_passed = current - last_check;
  last_check = current;
  allowance  = time_passed * (rate / per);
  if (allowance > rate):
    allowance = rate; // throttle
  if (allowance < 1.0):
    discard_message();
  else:
    forward_message();
    allowance -= 1.0;

Datastructures, zamanlayıcılar vb yok. ve temiz bir şekilde çalışıyor :) bu çözüm, bu, '' hızı en fazla saniyede 5/8 birim büyüyor, yani sekiz saniye başına en fazla beş adet. ödenek İletilen her mesaj her sekiz saniyede bir beş daha fazla mesaj gönderebilirsiniz. böylece bir birim fiyatından düşer.

rate bir tamsayı olması gerektiğini unutmayın, yani olmadan sıfır ondalık kısmı, ya da algoritma doğru (gerçek hızı rate/per olmayacak) işe yaramaz. E. g. rate=0.5; per=1.0; allowance asla 1.0 büyüyecek çünkü çalışmıyor. Ama rate=1.0; per=2.0; gayet iyi çalışıyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • kamaniusilelis

    kamaniusilel

    10 HAZİRAN 2011
  • Project Mooncircle

    Project Moon

    6 Aralık 2009