b'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