libc Sleep api performs a busy waiting

News123 news123 at free.fr
Mon Mar 8 23:25:24 CET 2010


Hi Steve,

Steve Holden wrote:
> Mahesh wrote:
>> Hi,
>>
>>  I am having a problem while using sleep function from libc , the
>> thread in which i am calling it is getting struck and not allowing
>> other threads to execute.  Here is a simple code that i am trying to
>> exeute
>>
>> import threading
>> import time
>> import dl
>>
>>
>> def dummy1():
>>     a=dl.open('/lib/libc.so.6')
>>     print "in thread 1 Start"
>>     a.call('sleep',2)
>>     #time.sleep(2)
>>     print "in thread 1 End"
>>
>> def dummy2():
>>     print "in thread 2 Start"
>>     time.sleep(1)
>>     print "in thread 2 End"
>> newThread1=threading.Thread(None,dummy1)
>> newThread2=threading.Thread(None,dummy2)
>> newThread1.start()
>> newThread2.start()
>>
>> print "in main"
>>
>>
>>
>> The out put of this program is  (In this case thread 1 even though i
>> am calling a sleep function its not allowing other threads to execute,
>> other threads execute only after the completion of first thread)
>>
>> in thread 1 Start
>> in thread 1 End
>> in thread 2 Start
>> in main
>> in thread 2 End
>>
>>
>> where as if i use time.sleep instead of a.call(sleep) the out put is
>> (which i guess is right behaviour, because it start the threads and
>> suspends them because the have sleep , and continue executing the main
>> thread)
>> in thread 1 Start
>> in thread 2 Start
>> in main
>> in thread 2 End
>> in thread 1 End
>>
>>
> Why not just use the time module's sleep function? Unlike the libc code
> it releases Python's GIL (global interpreter lock), thus allowing other
> threads to run.
> 
I fully agree for the given example.
Especcially time.sleep allows even sub second sleeps.

Out of curiousity though:

Is there any way to perform a call(), that releases the GIL before
calling  the function?

It would avoid writing a wrapper?


bye


N



More information about the Python-list mailing list