Y
Yue Fei
I have a multi thread python code, threads can start immediately if I run on command line, but I can get them started right the way if I call the same code from C/C++.
test code like this:
from threading import Thread
import thread
class testThread(Thread):
def __init__ (self, id):
Thread.__init__(self)
self.id = id
def run(self):
print " >>> thread ", self.id, " started"
j = 0
for i in range(1, 2000):
j = j+1
print " <<< thread ", self.id, " ended"
def run():
t1 = testThread(1);
t2 = testThread(2);
t3 = testThread(3);
print "> start t1"
t1.start();
print "> start t2"
t2.start();
print "> start t3"
t3.start();
If run this from command line, I get result immediately:
If I call this py code from c as:
Py_Initialize();
PyEval_InitThreads();
PyRun_SimpleString("import ****\n****.run()\n");
for (j=0; j<3; j++)
{
for (i=0; i<1000000; i++)
{
}
PyRun_SimpleString("print 'kick python'\n");
sleep(1);
printf("sleep\n");
}
printf("---------------- before Finalize()\n");
Py_Finalize();
printf("---------------- after Finalize()\n");
When c code is doing busy loop or sleeping, python thread can not run. they can only be executed when Py_Finalize(); is called. out put is like:
kick python
sleep
kick python
sleep
kick python
sleep
---------------- before Finalize() <<< thread 3 ended
<<< thread 2 ended
<<< thread 1 ended
---------------- after Finalize()
____________________________________________________________________________________
Never miss a thing. Make Yahoo your home page.
http://www.yahoo.com/r/hs
test code like this:
from threading import Thread
import thread
class testThread(Thread):
def __init__ (self, id):
Thread.__init__(self)
self.id = id
def run(self):
print " >>> thread ", self.id, " started"
j = 0
for i in range(1, 2000):
j = j+1
print " <<< thread ", self.id, " ended"
def run():
t1 = testThread(1);
t2 = testThread(2);
t3 = testThread(3);
print "> start t1"
t1.start();
print "> start t2"
t2.start();
print "> start t3"
t3.start();
If run this from command line, I get result immediately:
<<< thread 3 endedstart t1 <<< thread 1 ended
start t2
start t3 return from run() call
If I call this py code from c as:
Py_Initialize();
PyEval_InitThreads();
PyRun_SimpleString("import ****\n****.run()\n");
for (j=0; j<3; j++)
{
for (i=0; i<1000000; i++)
{
}
PyRun_SimpleString("print 'kick python'\n");
sleep(1);
printf("sleep\n");
}
printf("---------------- before Finalize()\n");
Py_Finalize();
printf("---------------- after Finalize()\n");
When c code is doing busy loop or sleeping, python thread can not run. they can only be executed when Py_Finalize(); is called. out put is like:
return from run() callstart t1
start t2
start t3
kick python
sleep
kick python
sleep
kick python
sleep
---------------- before Finalize() <<< thread 3 ended
<<< thread 2 ended
<<< thread 1 ended
---------------- after Finalize()
____________________________________________________________________________________
Never miss a thing. Make Yahoo your home page.
http://www.yahoo.com/r/hs