« first day (2472 days earlier)      last day (629 days later) » 

9:03 AM
Jellou
 
 
2 hours later…
10:46 AM
Oye @abulafia, tengo algo para tí.
Es un poco largo, sorry:
import asyncio
import math
import time
import sys


class TimeoutManager:
    def __init__( self, sleepRound = 1.0, sleepTime = 1.0 ):
        self._sleepRound = sleepRound
        self._sleepTime = sleepTime
        self._list = [ ]
        self._index = { }
        self._nextIdValue = 0
        self._stop = False
        self._stopEvent = None
        self._queued = 0
        self._timed = 0
        self._poped = 0

    def __sizeof__( self ):
        return len( self._list )

    @property
    def queued( self ):
El resultado de eso es:
Manager creado
Timeout en id 5 data5
Timeout en id 4 data4
Timeout en id 3 data3
Timeout en id 2 data2
Pero falta el id 1, y además yo espero que la lista sea a la inversa, que empiece en el id 1 y termine en el id 5
Bueno, yo lo dejo ahí, le echas un ojo cuando puedas ;-p
 
 
2 hours later…
12:27 PM
@Trauma Buff.. me está costando entenderlo. ¿Por qué generas un range "hacia atrás"? ¿Supones que _list está ordenado por timeout? Y aún en ese caso ¿no debería ir hacia adelante? Habrá que comprobar antes los timeouts más cercanos en el tiempo, digo yo, pues la tarea 1 terminará antes que la 5
Por otro lado, si quieres hacer un range hacia atrás, el final ha de ser -1 y no 0
pero claro, ya que tienes if self._list[listIdx][0] > now: break, y empiezas por el final (y la tarea final es la que tiene el timeout más tardío) esa condición se va a cumplir siempre hasta que hayan transcurrido los 5 segundos. Así que debido al break el resto de tareas no se examinan
hasta que la tarea de índice más alto no haya expirado, no se examinan las demás
Tampoco entiendo el papel de self._index
si dejo de lado lo de self._index, puedo reescribir tu bucle de gestión de timeouts de una forma mucho más pythónica y legible para mi. Así:
    async def _onTimeoutCode( self ):
        while self._stop == False:
            await asyncio.sleep( self._sleepTime )
            limit = None
            now = time.time( )

            print(self._list)
            for listIdx, (timeout, id, data, callback) in enumerate(self._list):
                if timeout > now: continue
                if callback is not None:
                    self._timed += 1
                    await callback(id, data)
                    limit = listIdx
                    # del self._index[listIdx]
Recorro la lista hacia adelante en vez de hacia atrás. Uso continue en vez de break para saltarme a los que no han excedido el timeout (no presupongo orden en la lista). Llamo al callback de los que han excedido el timeout, y luego los borro de la lista
Perdón, versión corregida:
    async def _onTimeoutCode( self ):
        while self._stop == False:
            await asyncio.sleep( self._sleepTime )
            limit = None
            now = time.time( )

            a_borrar = []
            for listIdx, (timeout, id, data, callback) in enumerate(self._list):
                if timeout > now: continue
                if callback is not None:
                    self._timed += 1
                    await callback(id, data)
                    a_borrar.append(listIdx)
                    # del self._index[listIdx]
quité eso de limit que tampoco entendía. ¿Por qué borrabas todo de limit en adelante? De nuevo parece que presupones una ordenación por timeouts en la lista
@trauma Y otro detalle, esto ya de asincronía... ¿realmente quieres hacer un await delante del callback? Eso los serializa... hasta que un callback no termine no podrías iniciar otro. Creo que lo suyo sería lanzarlos todos como tareas sin esperar por ellos, aunque eso ya no sé cómo se hace con asyncio
@trauma Ah, creo que ya entiendo de qué va lo de self._index pero tienes varias cosas mal. Si no me equivoco cuando lo inicializas debería ser self._index[id] = index, pero tú tienes self._index[index]=id
Con ese cambio y la siguiente modificación (espero que final) a _onTimeoutCode(), creo que ya funciona
Queda todo así:
import asyncio
import math
import time
import sys


class TimeoutManager:
    def __init__( self, sleepRound = 1.0, sleepTime = 1.0 ):
        self._sleepRound = sleepRound
        self._sleepTime = sleepTime
        self._list = [ ]
        self._index = { }
        self._nextIdValue = 0
        self._stop = False
        self._stopEvent = None
        self._queued = 0
        self._timed = 0
        self._poped = 0

    def __sizeof__( self ):
        return len( self._list )

    @property
    def queued( self ):
si prefieres, este es el diff de lo tuyo con lo mío
48c48
<         self._index[index] = id
---
>         self._index[id] = index
68d67
<
71,76c70,73
<             for listIdx in range( len( self._list ) - 1, 0, -1 ):
<                 if self._list[listIdx][0] > now: break
<
<                 realData = self._list[listIdx]
<
<                 if realData[3] is not None:
---
>             a_borrar = []
>             for listIdx, (timeout, id, data, callback) in enumerate(self._list):
>                 if timeout > now: continue
>                 if callback is not None:
 
1:07 PM
Gracias @abulafia. Tienes razón en lo que dices. Se ve que está mañana estaba yo especialmente ... espeso O_º
Lo he resuelto por mi lado, sacando el código a una función suelta. El tuyo me gusta mas, el mio sigue siendo poco pythonico xD
De todas formas tengo que darle una repensada ... lo de recorrer toda la lista buscando timeouts caducados no me termina de gustar :-/
Voy a intentar meterlo en un diccionario, usando como key el timeout futuro de expiración.
@abulafia ¡¡ Gracias !! :-D
Que no duermo bien, entre la caló y el joio El Gato ...
 
1:33 PM
@Trauma me suena que python tiene listas ordenadas basadas en arboles rojo-negro (no sé bien qué estoy diciendo), que permite insertar elementos en O(log N) o algo asi, manteniéndolos ordenados. Probablemente habría que usar algo de esto para tenerlos ordenados por timeout, asi no necesitas recorrer la lista entera cada vez
empezarías por el primer elemento y avanzarías procesando todos los caducados, y parando en el primero por caducar
 
 
2 hours later…
3:14 PM
como hago una pregunta o respuesta de wiki??
ya vi como
 
 
2 hours later…
4:57 PM
@ArcanisGK507 esa pregunta que pusiste.. no es valida... para nada...
si queres dejar solo la de php ok.. pero no podemos tener una lista de utilidades de debug por ide... porque no es por lenguaje, es por ide...
porque es una lista.. cual seria la respuesta aceptada?
 
5:20 PM
@gbianchi tienes razon ... yo llenando de basura el sitio XD
@gbianchi ya me encargue de borrarla
@gbianchi pensaba aceptar la mia que es de wiki ... y que vayan actualizandola por IDE o Lenguaje y vayan agregandole mas a la lista ...
pero ese no es el formato de sitio
 
@ArcanisGK507 desgraciadamente no...
aunque como entrada en algun lado seria muy interesante... pero mas que para un lenguaje, algo canonico de estrategias de depuracion...
pero ya te digo... vos viste solo php... si te metes con c#, depende de la ide, el tipo de app, que parte queres debuguear... es mucho mas complejo....
no es lo mismo debuguear winforms que wpf por ejemplo ;)
 
6:27 PM
@gbianchi si eso esta claro
 
7:04 PM
Hola a todos! ¿Alguien por acá?
 
 
2 hours later…
8:46 PM
@PedroUrday Yo, intermitentemente
 
 
2 hours later…
11:00 PM
@abulafia Hola! Tengo una duda. ¿Que tan bueno es usar QT Creator para programar aplicaciones mobiles para Android e IOS? Tambien sirve para crear apps para Windows, Linux y MacOS. Me gusta la idea de programar una sola vez y poder compilar para todas las plataformas.
¿Hay algun problema al programar para las plataformas mobiles usando QT Creator? C++ no me parece dificil y la biblioteca QT me gusta. ¿Que rendimiento tendrán las apps resultantes?
 

« first day (2472 days earlier)      last day (629 days later) »