Estoy trabajando en una biblioteca de Python que interactúa con una API de servicio web. Al igual que muchos servicios web que he encontrado, este solicita limitar la tasa de solicitudes. Me gustaría proporcionar un parámetro opcional, limit
, a la creación de instancias de clase que, si se proporciona, contendrá las solicitudes salientes hasta que pase el número de segundos especificado.¿Cómo limitar la tasa de solicitudes a servicios web en Python?
Entiendo que el escenario general es el siguiente: una instancia de la clase realiza una solicitud a través de un método. Cuando lo hace, el método emite una señal que establece una variable de bloqueo en algún lugar, y comienza un temporizador de cuenta atrás para el número de segundos en limit
. (Con toda probabilidad, el bloqueo es el propio temporizador de cuenta regresiva). Si se hace otra solicitud dentro de este marco de tiempo, debe ponerse en cola hasta que el temporizador de cuenta regresiva llegue a cero y el bloqueo se desactive; en este punto, se envía la solicitud más antigua en la cola, y se reinicia el temporizador de cuenta atrás y se vuelve a activar el bloqueo.
¿Es esto un caso para enhebrar? ¿Hay otro enfoque que no estoy viendo?
¿El temporizador de cuenta regresiva y el bloqueo deben ser variables de instancia, o deberían pertenecer a la clase, de modo que todas las instancias de la clase tengan solicitudes?
Además, ¿es generalmente una mala idea proporcionar funcionalidad de limitación de velocidad dentro de una biblioteca? Lo razono ya que, de forma predeterminada, la cuenta regresiva es de cero segundos, la biblioteca aún permite a los desarrolladores utilizar la biblioteca y proporcionar sus propios esquemas de limitación de velocidad. Dado que los desarrolladores que usen el servicio necesitarán limitar las solicitudes de todos modos, sin embargo, creo que sería una ventaja para la biblioteca proporcionar un medio para limitar las tasas.
Independientemente de colocar un esquema de limitación de velocidad en la biblioteca o no, querré escribir una aplicación usando la biblioteca, por lo que las técnicas sugeridas serán útiles.
Muchas gracias por sus sugerencias!
Chris
supuesto Bad. Espera 2 segundos.Eso será 2 seg. entre el final de uno y el comienzo de otro. Usualmente quieres 2 seg. entre el comienzo de uno y el comienzo de otro. –
Bueno, esperar 2 segundos entre el final de uno y el inicio de otro puede ser más seguro si los límites se basan en el tiempo real entre llamadas. El problema real es que la solución espera más de 2 entre solicitudes, ya que el cálculo entre solicitudes puede llevar tiempo. – Brian