libc Sleep api performs a busy waiting
News123
news123 at free.fr
Mon Mar 8 17:25:24 EST 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