One thread freezes my whole application

Michael Zhang jianqiz at bigpond.com
Thu Sep 30 11:46:44 EDT 2004


Anders J. Munch wrote:
> "Michael Zhang" <jianqiz at bigpond.com> wrote:
> 
>>The problem is when I click the connection button and invoke that
>>connection thread, the whole application (including base thread and
>>display thread) was frozen. What I expected was when one thread is
>>listerning the socket, the display thread should be able to continue its
>>running, and I should be able to invoke other (if any) threads from the
>>GUI base thread. Afterwards, I had to use ps/kill to clean them up.
>>
> 
> [...]
> 
>>     def run(self):
>>Cmodule.create_connection() # Cmodule is created from C
>>
> 
> Do I understand you correctly that Cmodule is a C extension?
> 
> If create_connection includes C code that does blocking I/O without
> releasing the global interpreter lock, your whole application will
> block.  Perhaps that's what you're seeing.
>

Thank you, Anders

Your hint on GIL leads me quite lots of searching and reading on Google. 
After several hours confusion (due to those different opinions), I 
finally come to a quite simple and amazing solution:

       Py_BEGIN_ALLOW_THREADS;	# add this line
       some_blocking_function_call();
       Py_BEGIN_ALLOW_THREADS;	# add this line as well

Now I've got what I really expected.

However, there is a new question (rather than a problem). Since my 
Cmodule is created using SWIG, if there is any change in the original C 
code, I have to run swig again to get new "Cmodule_wrap.c" file, and add 
above two lines into that new wrapper file, then build a new module. 
It's quite uncomfortable during debugging. Is there any way I can use to 
achieve the same goal on Python side code, rather that on C extension 
side? Can I just modify the Python code to release that GIL? or Do I 
have any misunderstading about GIL, say, the concept about GIL only 
applies to C extension rather than Python threading itself?

Michael



More information about the Python-list mailing list