<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>El hilo del laberinto (Publicaciones sobre mod_wsgi)</title><link>https://blog.jcea.es/</link><description></description><atom:link href="https://blog.jcea.es/categories/mod_wsgi.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><lastBuildDate>Sat, 11 Jul 2026 17:53:33 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Python 3.13: zlib.error: Error -2 while flushing: inconsistent stream state</title><link>https://blog.jcea.es/posts/20241229-python3_13-gzip.html</link><dc:creator>Jesús Cea Avión</dc:creator><description>&lt;div&gt;&lt;p&gt;Tras actualizar a &lt;a class="reference external" href="https://www.python.org/downloads/release/python-3130/"&gt;Python 3.13&lt;/a&gt; y
&lt;a class="reference external" href="https://modwsgi.readthedocs.io/en/master/"&gt;mod_wsgi&lt;/a&gt;, tal y como se describe en
&lt;a class="reference external" href="https://blog.jcea.es/posts/20241012-mod_wsgi_python3_13.html"&gt;Problema actualizando mis servicios WSGI a Python 3.13&lt;/a&gt;, empecé a ver estos errores en
el &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Log_(inform%C3%A1tica)"&gt;log&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Exception ignored in: &amp;lt;gzip on 0x7fd58e3c6fb0&amp;gt;
Traceback (most recent call last):
  File "/usr/local/lib/python3.13/gzip.py", line 373, in close
    fileobj.write(self.compress.flush())
zlib.error: Error -2 while flushing: inconsistent stream state
&lt;/pre&gt;
&lt;p&gt;La &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Manejo_de_excepciones"&gt;excepción&lt;/a&gt; no parece tener ningún efecto práctico en el
programa, pero muestra que hay un problema a resolver.&lt;/p&gt;
&lt;p&gt;Lo primero que llama la atención es que el &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Stack_trace"&gt;traceback&lt;/a&gt; no parece
completo, no indica qué código está llamando a la función
&lt;span class="kbd"&gt;close()&lt;/span&gt;. Ese detalle junto al mensaje &lt;span class="kbd"&gt;Exception
ignored in:&lt;/span&gt; indica que se trata de una &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Manejo_de_excepciones"&gt;excepción&lt;/a&gt; asíncrona que
ocurre en un &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Destructor_(inform%C3%A1tica)"&gt;destructor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Para saber qué parte del código está generando esa &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Manejo_de_excepciones"&gt;excepción&lt;/a&gt; (de
forma asíncrona), podemos modificar el código añadiendo esto al
principio:&lt;/p&gt;
&lt;table class="codetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-1"&gt; 1&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-2"&gt; 2&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-3"&gt; 3&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-4"&gt; 4&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-5"&gt; 5&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-6"&gt; 6&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-7"&gt; 7&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-8"&gt; 8&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-9"&gt; 9&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-10"&gt;10&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-11"&gt;11&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-12"&gt;12&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-13"&gt;13&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-14"&gt;14&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-15"&gt;15&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-16"&gt;16&lt;/a&gt;
&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html#rest_code_38a77e47e7da4052afa0d16d62dd9986-17"&gt;17&lt;/a&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code python"&gt;&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-1"&gt;&lt;/a&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;inspect&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-2"&gt;&lt;/a&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GzipFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gzip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GzipFile&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-3"&gt;&lt;/a&gt;     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-4"&gt;&lt;/a&gt;         &lt;span class="n"&gt;creador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-5"&gt;&lt;/a&gt;         &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_creador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;creador&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;creador&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;creador&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lineno&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-6"&gt;&lt;/a&gt;         &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;creador&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-7"&gt;&lt;/a&gt;         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-8"&gt;&lt;/a&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-9"&gt;&lt;/a&gt;     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-10"&gt;&lt;/a&gt;         &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-11"&gt;&lt;/a&gt;             &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"CLOSE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-12"&gt;&lt;/a&gt;             &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-13"&gt;&lt;/a&gt;         &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;exc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-14"&gt;&lt;/a&gt;             &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_creador&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-15"&gt;&lt;/a&gt;             &lt;span class="k"&gt;raise&lt;/span&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-16"&gt;&lt;/a&gt;
&lt;a name="rest_code_38a77e47e7da4052afa0d16d62dd9986-17"&gt;&lt;/a&gt; &lt;span class="n"&gt;gzip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GzipFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GzipFile&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;&lt;a href="https://blog.jcea.es/posts/20241229-python3_13-gzip.html"&gt;Leer más…&lt;/a&gt; (quedan 6 minutos de lectura)&lt;/p&gt;&lt;/div&gt;</description><category>Actualización</category><category>Bugs</category><category>Depuración</category><category>mod_wsgi</category><category>Python</category><guid>https://blog.jcea.es/posts/20241229-python3_13-gzip.html</guid><pubDate>Sun, 29 Dec 2024 09:32:00 GMT</pubDate></item><item><title>Problema actualizando mis servicios WSGI a Python 3.13</title><link>https://blog.jcea.es/posts/20241012-mod_wsgi_python3_13.html</link><dc:creator>Jesús Cea Avión</dc:creator><description>&lt;div&gt;&lt;p&gt;Acaba de salir &lt;a class="reference external" href="https://www.python.org/downloads/release/python-3130/"&gt;Python 3.13&lt;/a&gt; y, como
siempre, actualizo mi código y servicios a esta nueva versión.
Actualizo rápido para aprovechar las mejoras de la nueva versión
de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Python"&gt;Python&lt;/a&gt; y porque acumular actualizaciones pendientes supone que
el coste de migrar va creciendo cada año.&lt;/p&gt;
&lt;p&gt;Normalmente los cambios necesarios son mínimos, pero en esta
ocasión tengo problemas con mis servicios &lt;a class="reference external" href="https://es.wikipedia.org/wiki/WSGI"&gt;WSGI&lt;/a&gt; a través del
módulo &lt;a class="reference external" href="https://modwsgi.readthedocs.io/en/master/"&gt;mod_wsgi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Los servicios en sí parecen funcionar correctamente, pero los
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Log_(inform%C3%A1tica)"&gt;logs&lt;/a&gt; se saturan de cientos de líneas por segundo con el siguiente
error:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Exception ignored in: &amp;lt;_io.TextIOWrapper name='&amp;lt;wsgi.errors&amp;gt;' encoding='utf-8'&amp;gt;
RuntimeError: log object has expired
&lt;/pre&gt;
&lt;p&gt;Viendo el código fuente de &lt;a class="reference external" href="https://modwsgi.readthedocs.io/en/master/"&gt;mod_wsgi&lt;/a&gt; y del propio &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica)"&gt;intérprete&lt;/a&gt; de
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Python"&gt;Python&lt;/a&gt;, esto ocurre cuando se escribe en el &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Log_(inform%C3%A1tica)"&gt;log&lt;/a&gt; (o se hace
&lt;em&gt;flush&lt;/em&gt;) una vez que ya se ha llamado a &lt;strong&gt;close&lt;/strong&gt;. La parte de
&lt;strong&gt;Exception ignored&lt;/strong&gt; está dentro del &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica)"&gt;intérprete&lt;/a&gt; de &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Python"&gt;Python&lt;/a&gt;,
cuando se intenta escribir en un fichero que no puede dar una
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Manejo_de_excepciones"&gt;excepción&lt;/a&gt;. Por ejemplo, cuando un &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Destructor_(inform%C3%A1tica)"&gt;destructor&lt;/a&gt; levanta una
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/Manejo_de_excepciones"&gt;excepción&lt;/a&gt; o durante la &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)"&gt;recogida de basuras&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aunque todo parece ir bien, de momento seguiré con &lt;a class="reference external" href="https://es.wikipedia.org/wiki/Python"&gt;Python&lt;/a&gt; 3.12,
mientras investigo el problema en detalle. Ahora mismo estoy
bastante ocupado...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20241015:&lt;/strong&gt; Alguien se me ha adelantado informando del problema:
&lt;a class="reference external" href="https://github.com/GrahamDumpleton/mod_wsgi/issues/912"&gt;RuntimeError: log object has expired in mod_wsgi 5.0.1 with
Django 5.0.9 python 3.13.0 #912&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20241122:&lt;/strong&gt; Se publica la versión 5.0.2 de &lt;a class="reference external" href="https://modwsgi.readthedocs.io/en/master/"&gt;mod_wsgi&lt;/a&gt; que,
aparentemente, soluciona este problema.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20250125:&lt;/strong&gt; Encuentro un rato para actualizar mis servicios
&lt;a class="reference external" href="https://es.wikipedia.org/wiki/WSGI"&gt;WSGI&lt;/a&gt; a la nueva versión de &lt;a class="reference external" href="https://modwsgi.readthedocs.io/en/master/"&gt;mod_wsgi&lt;/a&gt; y confirmo que el problema
se ha solucionado.&lt;/p&gt;&lt;/div&gt;</description><category>Actualización</category><category>Bugs</category><category>Depuración</category><category>mod_wsgi</category><category>Python</category><guid>https://blog.jcea.es/posts/20241012-mod_wsgi_python3_13.html</guid><pubDate>Sat, 12 Oct 2024 00:00:00 GMT</pubDate></item></channel></rss>