On 22/01/2009 3:33 AM, Brad Johnson wrote:
I have embedded the Python interpreter into a COM application. In this
application, I create worker threads that execute Python code.
I marshal some COM objects that live in the UI thread of the application over to
the worker thread and wrap them with EnsureDispatch() for use in the new thread.
Meanwhile, the UI thread sometimes has work to do with Python. It attempts to
acquire the GIL and releases it when done.
How is the UI thread written and how does it attempt to use the GIL?
However, while it is waiting for the
GIL in the UI thread (when the worker thread has it), it is locked into a
WaitForSingleObject call (some layers below PyGILState_Ensure).
Obviously the GIL can only be held by one thread at a time. The
question then is why your worker thread isn't periodically releasing the
GIL so the UI thread can grab it.
Anyone that uses COM knows that this is not a COM-safe wait, and message pumping
will not continue. In other words, if my worker thread ever wants to marshal a
call back into the UI thread, it will deadlock.
That is not true - it is very easy to demonstrate a multi-threaded
program in Python that marshals COM objects between threads and doesn't
deadlock. Similarly, it is very easy to write a multi-threaded GUI app
(assuming you follow the windows threading GUI rules) which face an
almost identical problem (one thread must be in a message loop while the
others are not)
The GIL handles this situation just fine, so long as all C code does the
right thing. I don't think we understand you problem well enough to
give you any answers yet though.
Cheers,
Mark
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32