libc Sleep api performs a busy waiting

M

Mahesh

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
 
S

Steve Holden

Mahesh said:
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.

regards
Steve
 
N

News123

Hi Steve,

Steve said:
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
 
T

Thomas Heller

Joe said:
Hi,

actually i have simplified my scenario a lot here ,

In my actual case , i have to call a C-api which blocks on c select , in a
separate thread.

my thread is getting struck in that api , and thus blocking all the other
threads.
Can you point to something which will help me call this blocking C-api call
without my thread getting struck.
ctypes. Releases the GIL before calling C api functions.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,571
Members
45,045
Latest member
DRCM

Latest Threads

Top