cleitonleonel / pyquotex

Unofficial Quotex Library
Other
69 stars 53 forks source link

Observación relacionada a atascamiento de procesos. #30

Closed rloverab closed 3 weeks ago

rloverab commented 3 months ago

Saludos.

En el proyecto personal donde hago uso de esta librería, utilizo una misma conexión por websocket para realizar varias operaciones consecutivas. Es decir, lo que hago es abrir la conexión, usar varios métodos de la librería aprovechando esa conexión y al terminar cierro la conexión.

En mi caso todo funciona correctamente salvo las veces en la que de manera aleatoria se estanca. Estuve revisando el código y pude identificar en cual método ocurre el estancamiento. Es en el método send_ssid contenido en el archivo api.py.

Este es el método:

def send_ssid(self):
    self.wss_message = None
    if not global_value.SSID:
        return False
    self.ssid(global_value.SSID)
    while not self.wss_message:
        time.sleep(0.3)
    if not self.wss_message:
        return False
    return True

Si te fijas, la condición de repetición del bucle while es que el atributo wss_message sea NONE. Si el atributo wss_message deja de ser NONE se rompe el bucle y el algoritmo continua su ejecución.

Me he encontrado en situaciones donde el atributo wss_message nunca deja de ser NONE evitando que el bucle se rompa provocando de este modo el estancamiento.

También está el detalle de que la sentencia contenida en la condicional if not self.wss_message nunca se ejecuta. La razóin por la que nunca se ejecuta es porque si wss_message nunca deja de ser NONE, el algoritmo se estanca y no alcanza a llegar a la condicional. Pero si wss_message deja de ser NONE la condición not self.wss_message es FALSE, evitando la ejecución de las sentencias contenidas en ella.

Para resolver el problema hice una modificación al método la cual hasta el momento me ha dado buenos resultados.

El método modificado:

def send_ssid(self):
    self.wss_message = None
    if not global_value.SSID:
        return False
    self.ssid(global_value.SSID)
    # while not self.wss_message:
    #     time.sleep(0.3)
    # if not self.wss_message:
    #     return False
    # return True
    for i in range(33):
        if self.wss_message:
            return True
        time.sleep(0.3)
    return False

Prescindí del bucle while y de la condicional y lo reemplacé por un bucle for el cual se repite 33 veces. Decidí que fueran 33 iteraciones para poder establecer un tiempo de espera cercano a los 10 segundos (tomando en cuenta el retardo de 0.3 segundos) antes de dejar de insistir en la espera de que el atributo wss_message reciba un valor.

Comparto esto como aporte para contribuir con el desarrollo de esta librería de la cual también soy usuario.