Resoluci\xf3n de Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://podcast.jcea.es/python/13\n
Participantes:
\nJes\xfas Cea, email: jcea@jcea.es, twitter:\n @jcea, https://blog.jcea.es/,\n https://www.jcea.es/. Conectando desde Madrid.
\nV\xedctor Ram\xedrez, twitter: @virako,\n programador python y amante de vim, conectando desde Huelva.
\nMiguel S\xe1nchez, email:\n msanchez@uninet.edu, conectando desde\n Canarias.
\nJuan Carlos.
\nPlutarco, conectando desde Madrid.
\nEduardo Castro, email:\n info@ecdesign.es. Conectando desde A\n Guarda.
\nJulio, conectando desde Chile.
\nAudio editado por Pablo G\xf3mez, twitter:\n@julebek.
\nLa m\xfasica de la entrada y la salida es "Lightning Bugs", de Jason\nShaw. Publicada en https://audionautix.com/ con licencia\n- Creative Commons Attribution 4.0 International\nLicense.
\n[00:52] Presentaciones.
\n[03:24] Aviso legal de que se est\xe1 grabando y objetivos de la\ntertulia.
\n[06:22] Autoimport, \xbfdeber\xeda ser una funcionalidad del IDE?
\n[12:52] Los IDEs y las inercias.
\nPyCharm: https://www.jetbrains.com/pycharm/.
\nAtajos de teclado.
\nvim: https://es.wikipedia.org/wiki/Vim.
\nUso del teclado en vez del rat\xf3n.
\n[19:22] Operador morsa (walrus). Sigue us\xe1ndose muy poco.
\nPython va complicando la sintaxis m\xe1s y m\xe1s.
\nSe habl\xf3 en una tertulia anterior.
\nJes\xfas solo ha encontrado este caso \xfatil:
\nPasar de:
\nbuf = f.read(1000)\nwhile buf:\n [Hace el procesamiento]\n buf = f.read(1000)\n
\nA lo siguiente:
\nwhile buf := f.read(1000):\n [Hace el procesamiento]\n
\n[25:57] Erratas en tertulias anteriores:
\nMigraci\xf3n de Python a Github fue en 2017.
\nNo es "Steering committee" sino "Steering Council".
\n[27:02] Pablo Galindo forma parte del "council" tras las\n \xfaltimas elecciones.
\nCharla de Pablo Galindo en la PyconES 2019 sobre el mundo\nde los Core Developers de Python:\nhttps://www.youtube.com/watch?v=qcvZOaY1emk.
\nAlgunos proyectos Python est\xe1n usando Rust. Por ejemplo:\n https://cryptography.io/, con cierta pol\xe9mica. Mercurial\n tambi\xe9n usa Rust https://www.mercurial-scm.org/.
\nLas variables locales pueden ser modificadas a trav\xe9s de su\n "closure", en funciones hijas o en otros hilos. Es una\n barbaridad, pero la posibilidad existe.
\nEsto es lo que hace, por ejemplo, un debugger.
\n[35:37] \xa1Spoiler sobre la resoluci\xf3n del "Memory Leak"!
\nIssue35930: Raising an exception raised in a "future"\n instance will create reference cycles\n https://bugs.python.org/issue35930.
\nTraceback:\n https://docs.python.org/3/library/traceback.html
\nFrame:\n https://docs.python.org/3/library/traceback.html#traceback.FrameSummary.
\nStack:\n https://docs.python.org/3/library/traceback.html#stacksummary-objects.
\n[39:17] Usar una t\xe9cnica similar para detectar las\n caracter\xedsticas de quien te llama para poder mezclar de forma\n m\xe1s limpia c\xf3digo s\xedncrono y as\xedncrono.
\n[41:32] Sigo explicando detalles de la soluci\xf3n del "Memory\n Leak".
\nIssue35930: Raising an exception raised in a "future"\n instance will create reference cycles\n https://bugs.python.org/issue35930.
\nEstamos continuando una conversaci\xf3n que ha durado varias\n tertulias.
\nJes\xfas Cea pone un ejemplo de c\xf3mo generar un ciclo con una\n excepcion.
\nLa caja y media de cervezas se las lleva... \xa1Jes\xfas!
\n[47:22] No se est\xe1 conectando gente desde Hispanoam\xe9rica. \xbfPor\n qu\xe9?
\n[50:07] M\xe1s erratas: Los "tracebacks" NO son inmutables.
\n[50:32] Nuevo m\xe9todo "with_traceback()" a la hora de crear\n excepciones:
\nhttps://docs.python.org/3/library/exceptions.html#BaseException.with_traceback.
\nPuedes generar una excepci\xf3n con un "traceback"\narbitrario.
\nEl caballo de batalla del bug es que el "future"\n https://docs.python.org/3/library/concurrent.futures.html\n levanta una excepci\xf3n y esa excepci\xf3n debe "transportarse" a\n otro hilo.
\nExplicando c\xf3mo se visualizan los "traceback" si un "future"\n https://docs.python.org/3/library/concurrent.futures.html\n muere con una excepci\xf3n.
\ndef a():\n 1/0\n\ntry:\n a()\nexcept Exception as e:\n raise e\n\nTraceback (most recent call last):\n File "<stdin>", line 4, in <module>\n File "<stdin>", line 2, in <module>\n File "<stdin>", line 2, in a\nZeroDivisionError: division by zero\n
\nCuando un "future"\n https://docs.python.org/3/library/concurrent.futures.html\n lanza una excepci\xf3n, se ven "frames" repetidos.
\nHay varias formas de solucionar el bug. Ahora hay que pensar\n en cual elegir, que sea la m\xe1s simple e intuitiva.
\n[01:01:52] Sobre el "nivel" de las tertulias y sus motivaciones.
\n[01:06:12] Referencia r\xe1pida a temas de la tertulia anterior:
\nDataclasses:\n https://docs.python.org/3/library/dataclasses.html. Se\n hablo mucho sobre ellas en la tertulia de la semana pasada.
\nPydantic: https://pypi.org/project/pydantic/.
\nFastAPI: https://pypi.org/project/fastapi/.
\n[01:09:17] Diagn\xf3stico exhaustivo del bug "Memory Leak", causa\n ra\xedz y propuestas de soluciones.
\nIssue35930: Raising an exception raised in a "future"\n instance will create reference cycles\n https://bugs.python.org/issue35930.
\nExploraci\xf3n del propio c\xf3digo fuente de Python.
\nRepaso detallado del funcionamiento de un "future"\n https://docs.python.org/3/library/concurrent.futures.html.
\nUno de los problemas fundamentales de trabajar con hilos es\n c\xf3mo notificar excepciones a otros hilos. La gran ventaja de\n los "futures" es gestionar esto de forma trivial.
\nEste "transporte" es lo que est\xe1 ocasionando el "Memory\n Leak".
\n\xa1Ag\xe1rrate que vienen curvas!
\n[01:21:32] Ojo a la l\xednea self = None
. Aqu\xed se rompe el\n ciclo en la excepci\xf3n original:\n https://github.com/python/cpython/blob/3.9/Lib/concurrent/futures/thread.py#L47.
Closures:\n https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).
\n"Pool" de "workers". De forma est\xe1ndar, Python te\n proporciona dos ejecutores: el ejecutor de hilos y el\n ejecutor de procesos\n https://docs.python.org/3/library/concurrent.futures.html#executor-objects.
\n[01:31:32] Las partes relevantes en el hilo principal son:
\n\n[01:37:02] \xa1Brainstorming!
\n[01:42:42] try ... finally
Jejeje, alguien propone algo que funcionar\xeda :-).
\n[01:43:57] Weakref:\n https://docs.python.org/3/library/weakref.html. Hay\n contertulios que no est\xe1n familiarizados con el concepto,\n Jes\xfas Cea repasa qu\xe9 son y para qu\xe9 sirven las "Weakref".
\nSe pueden "resucitar" objetos.
\n[01:51:02] Volvemos al hilo, la correcci\xf3n del bug.
\nEl gr\xe1fico de antes, con ciclos:\n https://lists.es.python.org/pipermail/general/attachments/20201229/0c14bc58/attachment-0002.png.
\nEl gr\xe1fico de despu\xe9s, sin ciclos:\n https://lists.es.python.org/pipermail/general/attachments/20201229/0c14bc58/attachment-0003.png.
\n[01:55:12] Comprobar este bug con un test unitario.
\nPor sus caracter\xedsticas... complicado.
\n"sys.getrefcount()":\n https://docs.python.org/3/library/sys.html#sys.getrefcount.
\n"sys.exc_info()": https://docs.python.org/3/library/sys.html#sys.exc_info.
\n"Race conditions":\n https://es.wikipedia.org/wiki/Condici%C3%B3n_de_carrera.
\n[01:59:22] Cuando recoge basura de objetos, podemos pedir que\n los guarde en "gc.garbage" para revisarlos:\n https://docs.python.org/3/library/gc.html#gc.garbage.
\n"gc.DEBUG_SAVEALL":\n https://docs.python.org/3/library/gc.html#gc.DEBUG_SAVEALL.
\nSe puede limpiar "gc.garbage" antes de la ejecuci\xf3n del\n c\xf3digo que nos interesa analizar.
\n[02:03:42] Bola extra:
\nEditar los audios.
\nMachine learning para el procesado de audio.
\nEl problema del cocktail:\n https://en.wikipedia.org/wiki/Cocktail_party_effect y\n una soluci\xf3n aplicando inteligencia artificial:\n https://www.technologyreview.com/2015/04/29/168316/deep-learning-machine-solves-the-cocktail-party-problem/.
\nRNNoise https://jmvalin.ca/demo/rnnoise/.
\n[02:09:52] Repaso del d\xeda para los que llegaron tarde.
\n[02:12:52] Weakref:\n https://docs.python.org/3/library/weakref.html.
\nJes\xfas ofrece algunos ejemplos de su utilidad.
\n[02:19:22] Iteradores WSGI\n https://www.python.org/dev/peps/pep-0333/.
\n[02:21:12] Weakref en cach\xe9 de objetos Durus\n https://www.mems-exchange.org/software/DurusWorks/DurusWorks-1.2.tar.gz/DurusWorks-1.2/doc/durus.html.
\n[02:23:52] El valor de la tertulia es llevarse algo que probar\n en casa.
\n[02:25:22] La tertulia la hacen los asistentes.
\n[02:28:36] Final.
\n