[PyQt] Re: Embedding w/ multi-threaded Python
McKay Davis
mckay.cpp at gmail.com
Tue Mar 10 21:40:48 GMT 2009
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.
Is there a way to allow only our program to access PyQt and end-users
access to the python interpreter too?
-McKay
More information about the PyQt
mailing list