[PyQt] Re: Embedding w/ multi-threaded Python

Roberto Alsina ralsina at kde.org
Tue Mar 10 22:07:29 GMT 2009


On Tuesday 10 March 2009 19:40:48 McKay Davis wrote:
> On Tue, Mar 10, 2009 at 11:08 AM, Phil Thompson
>
> <phil at riverbankcomputing.com> wrote:
> > On Tue, 10 Mar 2009 10:30:04 -1000, McKay Davis <mckay.cpp at gmail.com>
> >
> > wrote:
> >> After no response, maybe more specifics with our Multi-Threaded Python
> >> w/ PyQt problem would help:
> >>
> >> In the main thread, we do:
> >>
> >> PyEval_InitThreads(); // acquires the lock
> >> PyInitialize();
> >> // other init stuff
> >> PyThread_release_lock()
> >>
> >> …and in each new Python thread we do:
> >> Py_NewInterpreter()
> >> …
> >> PyThreads_release_lock()
> >>
> >> We call release()/acquire() blocks whenever the python script does a
> >> blocking operation.  A specific example of a lockup with PyQT is
> >> running examples/tutorial/t8.pyw.  We basically:
> >>
> >> PyThreads_acquire_lock()
> >> <run example script>
> >> PyThreads_release_lock()
> >>
> >> When a slot is invoked as a result of the slider being moved we get a
> >> deadlock.  This happens when sip_ProtectVirt_languageChange calls
> >> PyThreads_release_lock() on an already released lock.  If we don’t
> >> release the lock after the main thread PyQT script code runs, then the
> >> script runs fine – but our other python script threads will be starved
> >> out.
> >>
> >> Anybody have any ideas on how to resolve this deadlock?
> >
> > PyQt uses the PyGILState_* functions. These aren't supported with
> > multiple interpreters - see the docs for Py_NewInterpreter().
>
> So its not possible to run PyQt with multiple python interpreters?
>
> This is too bad, because we require the ability to allow users to
> script our application using Python.  But, we would also like to
> internally use PyQt for GUI development.  If we only have one
> interpreter then we cannot use PyQt because we cannot allow end-users
> the ability to potentially develop PyQt under the commercial license.

Why not use multiprocessing and some sort of message passing via queues? Of 
course maybe I am not understanding what you are trying to do :-)

> Is there a way to allow only our program to access PyQt and end-users
> access to the python interpreter too?
>
> -McKay
>
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt




More information about the PyQt mailing list