Skip to main content

Ralsina.Me — Roberto Alsina's website

PyQt Quickie: Don't Get Garbage Collected

There is one area where Qt and Python (and in con­se­quence PyQt) have ma­jor dis­agree­ments. That area is mem­o­ry man­age­men­t.

While Qt has its own mech­a­nisms to han­dle ob­ject al­lo­ca­tion and dis­pos­al (the hi­er­ar­chi­cal QOb­ject trees, smart point­er­s, etc.), PyQt runs on Python, so it has garbage col­lec­tion.

Let's con­sid­er a sim­ple ex­am­ple:

from PyQt4 import QtCore

def finished():
    print "The process is done!"
    # Quit the app
    QtCore.QCoreApplication.instance().quit()

def launch_process():
    # Do something asynchronously
    proc = QtCore.QProcess()
    proc.start("/bin/sleep 3")
    # After it finishes, call finished
    proc.finished.connect(finished)

def main():
    app = QtCore.QCoreApplication([])
    # Launch the process
    launch_process()
    app.exec_()

main()

If you run this, this is what will hap­pen:

QProcess: Destroyed while process is still running.
The process is done!

Plus, the script never ends. Fun! The problem is that proc is being deleted at the end of launch_process because there are no more references to it.

Here is a bet­ter way to do it:

from PyQt4 import QtCore

processes = set([])

def finished():
    print "The process is done!"
    # Quit the app
    QtCore.QCoreApplication.instance().quit()

def launch_process():
    # Do something asynchronously
    proc = QtCore.QProcess()
    processes.add(proc)
    proc.start("/bin/sleep 3")
    # After it finishes, call finished
    proc.finished.connect(finished)

def main():
    app = QtCore.QCoreApplication([])
    # Launch the process
    launch_process()
    app.exec_()

main()

Here, we add a global processes set and add proc there so we always keep a reference to it. Now, the program works as intended. However, it still has an issue: we are leaking QProcess objects.

While in this case the leak is very short­-lived, since we are end­ing the pro­gram right af­ter the process end­s, in a re­al pro­gram this is not a good idea.

So, we would need to add a way to remove proc from processes in finished. This is not as easy as it may seem. Here is an idea that will not work as you expect:

def launch_process():
    # Do something asynchronously
    proc = QtCore.QProcess()
    processes.add(proc)
    proc.start("/bin/sleep 3")
    # Remove the process from the global set when done
    proc.finished.connect(lambda: processes.remove(proc))
    # After it finishes, call finished
    proc.finished.connect(finished)

In this version, we will still leak proc, even though processes is empty! Why? Because we are keeping a reference to proc in the lambda!

I don't really have a good answer for that that doesn't involve turning everything into members of a QObject and using sender to figure out what process is ending, or using QSignalMapper. That version is left as an exercise.

Es sobre Divididos, debe ser en dos partes.

Again: span­ish on­ly!


De­spués de mi post de ay­er ac­er­ca de la le­tra de "Paisano de Hurling­ham" recibí un alu­vión de cor­rec­ciones y ex­pli­ca­ciones, que enu­mero a con­tin­uación.

Opalina:

Es una ref­er­en­cia a Opali­nas Hurling­ham, una fábri­ca abier­ta en 1948, y aban­don­a­da des­de 1994. Hay una in­tere­sante colec­ción de fo­tos de su in­te­ri­or en flickr

La em­pre­sa fué a la quiebra prin­ci­pal­mente por un juicio pi­o­nero so­bre daño am­bi­en­tal: en­ve­nen­a­ba las na­pas de la zona con ar­séni­co.

La línea de tren:

Es el ra­mal Re­tiro/Pi­lar del fer­ro­car­ril San Martín, que efec­ti­va­mente pasa por Hurling­ham. Mea cul­pa.

Abejas con ombú:

Las abe­jas son tra­ba­jado­ras. Om­bú es la mar­ca más cono­ci­da de ropa de tra­ba­jo en Ar­genti­na. Habla tal vez mal de mí que no se me ocur­ri­er­a.

Sapo explota:

Mi mamá hacía ex­plotar sapos forzán­do­los a fu­mar, cuan­do era chi­ca. No he oí­do otra ref­er­en­cia a sapos ex­plo­sivos.

Sigue sien­do un mis­te­rio el porqué el sapo ex­plota los domin­gos a las 10.

Berretín de mayor:

Jer­ga zon­al ac­er­ca de ser un ma­lan­dra.

Me ac­er­can rock checo, aunque no eslo­va­co.

Des­de ya muchas gra­cias por sus aportes!

Visto de cerca, todo está hecho de nada

Sor­ry, span­ish on­ly post. But you can lis­ten to the song here


Divididos

Si tu­viera 5 blogs y la en­ergía para postear en to­dos, el cuar­to sería "anal­izan­do de­masi­a­do la le­tra de can­ciones". En hom­e­na­je a ese blog que nun­ca va a ex­i­s­tir, este sería el primer post: Paisano de Hurling­ham, de Di­vi­di­dos (prob­a­ble­mente mi ban­da fa­vorita).

Primero, la le­tra com­ple­ta:

Paisano de Hurlingham
poda neblina
moneda o botón
ciego bilingüe
paso morales fue
sin la opalina
de Retiro a Pilar
busca el chancho al chabon.
Sapo explota en San Martín
los domingos a las diez
sable recto en la estación
berretin de mayor.
Canilla en el anden
gotea noticias
te grita el titular
mentiras sin picar.
Abejas con ombu
viajando en el panal
va la timba en el furgón.

Al pare­cer hay un cier­to con­sen­so (en­tre las tres per­sonas a quienes les pre­gun­té), de que es­ta can­ción es la de­scrip­ción de un vi­a­je en tren.

Las le­tras de Di­vi­di­dos no se car­ac­ter­i­zan por ser in­ter­preta­bles lin­eal­mente, De he­cho, sospe­cho que la may­oría son sim­ple­mente una se­rie de pal­abras una de­spués de la otra porque "sue­nan bi­en jun­tas".

El primer ver­so "Paisano de Hurling­ham" es el tí­tu­lo mis­mo de la can­ción, y, supon­go, el pro­tag­o­nista de es­ta mín­i­ma odis­ea sub­ur­bana. "po­da nebli­na" es in­tere­sante. No en­cuen­tro (gra­cias google) ningu­na ref­er­en­cia a esa frase fuera de es­ta can­ción. Es posi­ble que nadie jamás haya di­cho "po­da nebli­na" has­ta que Mol­lo can­tó esa es­tro­fa.

Para que se ha­gan una idea de lo raro que es es­o, hay dos ref­er­en­cias in­de­pen­di­entes a "nava­ja de­sier­ta", que son dos pal­abras al azar sacadas del dic­cionari­o. ¿En­ton­ces, qué es "po­da nebli­na"? Bueno, si es muy tem­pra­no, hay nebli­na, y el paisano la atraviesa, la cor­ta, la po­da. Así que, tiran­do de los pe­los (que lo va­mos a hac­er bas­tan­te), pode­mos supon­er que nos ubi­ca tem­po­ral­mente en una madru­ga­da nebli­nosa.

Más ob­vio es "mone­da o botón". Habla de hac­er tram­pa, de pasar un botón donde de­bería haber una mon­e­da. No se puede hac­er eso con el ca­jero, ni con un vende­dor, pero sí se puede en la limosna del "ciego bil­ingüe".

"pa­so morales" es ob­vi­a. Es la calle Pa­so Morales, en Vil­la Te­sei. De he­cho esa calle cor­ta la vía del tren que viene de Chacar­i­ta, lo que con­fir­ma que hablam­os de un vi­a­je por las vías.

Es difí­cil jus­ti­ficar "sin la opali­na". De he­cho, no lo voy a in­ten­tar. "de Re­tiro a Pi­lar / bus­ca el chan­cho al chabón" es tal vez la línea más ob­vi­a: es un guar­da de tren que bus­ca a un pasajero que no pa­ga, y lo per­sigue des­de Re­tiro a Pi­lar. El prob­le­ma con esa ob­viedad es que:

  1. El tren que hace Re­tiro/Pi­lar no pasa por Hurling­ham

  2. El tren que cor­­ta Pa­­so Morales sale de Chacar­i­­ta (y sí pasa por Hurling­ham).

¿Es tal vez que "De Chacari­ta a Hurling­ham" es im­posi­ble des­de un pun­to de vista de métri­ca? Sería com­pren­si­ble si así fuer­a.

"S­apo ex­plota en San Martín / los domin­gos a las diez" es os­cu­ra. Además de que ningu­na de las líneas de fer­ro­car­ril men­cionadas pasa por San Martín. ¡Pero el recor­ri­do Re­tiro/Pi­lar es de la línea San Martín! Si bi­en no lo­gramos es­clare­cer qué sapo ex­plota, porqué ni dón­de, sí sabe­mos el cuán­do. Es­to for­t­alece la hipóte­sis de que el paisano por al­gún mo­ti­vo es­tá yen­do a Pi­lar.

Tam­bién es san­mar­tini­ana la ref­er­en­cia al "s­able rec­to en la estación", por con­tra­posi­ción al famoso sable cor­vo del Gen­er­al. Que nun­ca jamás tu­vo el gra­do de May­or (as­cendió de capitán a gen­er­al), lo que com­pli­ca en­casil­lar "ber­retín de may­or".

"Canil­la en el andén / gotea noti­cias / te gri­ta el tit­u­lar / men­ti­ras sin pi­car" es di­rec­ta. Un canil­li­ta, un canil­la, es un vende­dor de di­ar­ios. Las canil­las gotean, los canil­li­tas gotean noti­cias. Gri­tan los tit­u­lares (aunque creo que ningún canil­li­ta gri­ta los tí­tu­los des­de 1947 o al­go así). Men­ti­ras sin pi­car, porque el pa­pel no es­tá pi­cado, to­davía, porque es un di­ario de hoy.

Y lleg­amos a la es­tro­fa fi­nal, "Abe­jas con om­bu / vi­a­jan­do en el panal / va la tim­ba en el furgón." Me re­sis­to a dar una in­ter­pretación, mas al­lá de que las abe­jas en el panal van apre­tadas, y que om­bú es una mar­ca de pa­pel para ar­mar cigar­ril­los, que se­gu­ra­mente la gente de la ban­da ha us­a­do en abun­dan­cia para drog­a­rse, un in­gre­di­ente que sospe­cho im­por­tante en la es­crit­u­ra de sus le­tras.

¿Qué con­clusión pode­mos sacar de este análi­sis? Bueno, yo, per­sonal­mente, preferiría no en­ten­der lo que di­cen, que Di­vi­di­dos fuera una ban­da de rock eslo­va­co, y poder sen­tir la pata­da en la frente que es es­ta can­ción sin tratar de en­ten­der qué cara­jo es "s­apo ex­plota en san martín". Pero eso es un prob­le­ma mío.

UP­DATE: Al­gu­nas aclara­ciones, datos ex­tras, y un tema de rock checo, aquí

I've seen things you people wouldn't believe. Attack ships on fire off the shoulder of Orion.

am very dis­tract­ed when I walk down the street. Or rather, I am pay­ing a lot of at­ten­tion, but it's spread over a whole lot of dif­fer­ent things.

/galleries/picplz/picplz_20120113_00007304032_original.jpg

Her name is Faith Pop­corn. Seen on Mar del Pla­ta.

My favourite, since I am a com­pul­sive read­er, is read­ing street sign­s. There is al­ways some­thing off about signs in a for­eign coun­try. They are ei­ther about things oth­er coun­tries don't care about, or are writ­ten in a com­plete­ly dif­fer­ent style.

/galleries/picplz/picplz_20120207_00008126220_original.jpg

Fixed hair braid­ing prices in Ba­hamas

And some­times you run in­to things you just have nev­er seen be­fore. Those things can be found any­where, and can be any­thing, since ... well, you have nev­er seen them be­fore.

http://farm4.staticflickr.com/3094/5716714548_e2417400f0.jpg

And now, a hy­drant wear­ing a sweater in Bu­da­pest.

It does­n't have to be some­thing re­al­ly strange, it may just be some­thing you have not seen be­fore by chance.

http://farm6.staticflickr.com/5107/5680154086_a29bb67376.jpg

Street sweep­ers get OCD too. Seen on San Isidro.

Or maybe you just fig­ure some­thing out right there and then.

http://farm4.staticflickr.com/3245/5706390321_dd9ee67e16.jpg

So that's why sug­ar cubes are bet­ter. Seen in Bu­da­pest.

Or ... you don't know what to say.

http://farm6.staticflickr.com/5143/5644622284_f35d445242.jpg

Seen at Ti­gre. I have no idea.

Or things you don't have where you come from.

http://farm6.staticflickr.com/5029/5624290042_a792d40365.jpg

Blimp! Seen in Lon­don.

Or they are just so po­lite to ask.

/galleries/picplz/picplz_20111012_00004949046_original.jpg

Or you don't un­der­stand at first.

http://farm3.staticflickr.com/2176/5716716950_fb9287dfd4.jpg

How did that kid get there?

And then you do.

http://farm4.staticflickr.com/3594/5716730390_1bb2c9e200.jpg

It's a trick foun­tain! Seen in Bu­da­pest.

Or maybe it's some­thing you see ev­ery day, out of con­tex­t.

http://farm4.staticflickr.com/3179/5716152091_0ef7f3d92d.jpg

A typ­i­cal ar­gen­tini­an mi­lane­sa sand­wich. Bought on the street in Bu­da­pest.

http://farm6.staticflickr.com/5228/5776570777_9d360518f2.jpg

A DI­A% su­per­mar­ket, like the one near my home. In Is­tan­bul.

And some­times it's some­thing you nev­er sus­pect­ed even ex­ist­ed, or how it could ex­ist.

http://farm4.staticflickr.com/3504/5751512857_132b97f1cc.jpg

This is a chap­ter in a turk­ish book. It takes place at my wed­ding.

Or out of con­tex­t.

http://farm5.staticflickr.com/4140/4930179412_207cc28c56.jpg

Seen around the cor­ner of my house.

Or alien.

/galleries/picplz/picplz_20111031_00005352846_original.jpg

Ho­tel tow­el, seen in Or­lan­do, Flor­i­da.

Or

/galleries/picplz/picplz_20111012_00004949505_original.jpg

Yes, I did get a hair­cut. Seen in Lon­don.

Or

/galleries/picplz/picplz_20110530_00002356027_original.jpg

Fer­ry in Is­tan­bul

Or

/galleries/picplz/picplz_20120207_00008127723_original.jpg

True TV Re­mote seen in a ho­tel in Aveni­da de May­o, Buenos Aires, in 2004.

this, ex­cept for that TV re­mote, is just a small sam­ple of what I have seen in the last 12 month­s. These have been a re­al­ly cool 12 month­s.


Contents © 2000-2023 Roberto Alsina