[PyQt] QProcess hangup using PyQt + threads

Phil Thompson phil at riverbankcomputing.com
Fri Feb 26 13:34:16 GMT 2010


On Fri, 26 Feb 2010 14:14:51 +0100, Denis RIVIERE <denis.riviere at cea.fr>
wrote:
> Le vendredi 26 février 2010, Phil Thompson a écrit :
>> On Fri, 26 Feb 2010 12:08:58 +0000, Phil Thompson
>>
>> <phil at riverbankcomputing.com> wrote:
>> >
>> > Unless you can provide me with a test case you'll have to
experiment...
>> >
>> > Try adding...
>> >
>> >     pthread_atfork(NULL, NULL, PyOS_AfterFork);
>> >
>> > ...after the call to PyEval_InitThreads() in siplib.c.
>>
>> An alternative (which I may be more comfortable with) is to add the
>> /HoldGIL/ annotation to all QProcess.start() overloads. However the
>> asynchronous nature of process starts may mean it has no effect.
>>
>> Phil
> 
> I will try the pthread_atfork() thing, which seems to me to be safer.
While
> I 
> recompile sip and PyQt (I was using the linux distribution compiled
> version), 
> here is a test case, which holds after a while:
> 
> 
> #!/usr/bin/env python
> 
> import threading
> from PyQt4 import QtCore
> 
> def theotherthread():
>     print 'theotherthread'
>     while True:
>         a = 'turlute'
> 
> def processExited():
>     print 'processExited'
> 
> def readStdout():
>     global qprocess
>     print qprocess.readAllStandardOutput()
> 
> def readStderr():
>     global qprocess
>     print qprocess.readAllStandardError()
> 
> thread1 = threading.Thread( target=theotherthread )
> thread1.start()
> while True:
>     qprocess = QtCore.QProcess()
>     qprocess.connect( qprocess,
>                       QtCore.SIGNAL( 'finished( int, 
> QProcess::ExitStatus )' ),
>                       processExited )
>     qprocess.connect( qprocess, QtCore.SIGNAL(
'readyReadStandardOutput()'
>     ),
>                       readStdout  )
>     qprocess.connect( qprocess, QtCore.SIGNAL( 'readyReadStandardError()'
>     ),
>                       readStderr  )
>     qprocess.start( 'echo', [ 'totototototototo' ] )
>     qprocess.waitForFinished(-1)

The pthread_atfork() didn't work for me.

The /HoldGIL/ annotation did.

Phil


More information about the PyQt mailing list