Different execution time in python code between embedded or standalone

Pau Freixes pfreixes at milnou.net
Sun Jun 8 12:07:26 CEST 2008


HI list,

I found the problem guys, when I embedded python code didn't call to
PyEval_InitThreads();
This function initialize GIL and other data structures for do a python code
thread safe. I believe the python traditional ( python name_script.py ) run
always a thread safe interpreter.

Therefore, it's normal  found best performance  in no thread safe
environment and thread safe environment.

But I have a small question, if I have a typical PyObject_CallObject
environment and main code don't call to PyEval_InitThreads() after
Py_Initialize(), if in python code function called launch some threads this
interpreter will be prepare for handle more one thread with python thread
safe environment, can everybody help me ?

Thks


On Tue, Jun 3, 2008 at 9:58 PM, Pau Freixes <pfreixes at milnou.net> wrote:

> Hi list,
>
> First Hello to all, this is my and hope not end message to the list :P
>
> This last months I have been writting a  program in c like to mod_python
> for embedding python language, it's a middleware for dispatch and execute
> python batch programs into several nodes. Now I'm writing some python
> program for test how scale this into several nodes and comparing with
> "standalone" performance.
>
> I found a very strange problem with one application named md5challenge,
> this aplication try to calculate the max number md5 digest in several
> seconds, md5challenge use a simple signal alarm for stop program when time
> has passed. This is the code of python script
>
> def handler_alrm(signum, frame):
>     global _signal
>     global _nrdigest
>     global _f
>
>
>     _signal = True
>
> def try_me():
>     global _nrdigest
>     global _f
>     global _signal
>
>     _f = open("/dev/urandom","r")
>     while _signal is not True:
>         buff = _f.read(_const_b)
>         md5.md5(buff).hexdigest()
>         _nrdigest = _nrdigest + 1
>
>     if _f is not None :
>         _f.close()
>
> def main( req ):
>     global _nrdigest
>
>
>     signal.signal(signal.SIGALRM, handler_alrm)
>     signal.alarm(req.input['time'])
>
>
>     try_me()
>
>     req.output['count'] = _nrdigest
>
>     return req.OK
>
>
> if __name__ == "__main__":
>
>     # test code
>     class test_req:
>         pass
>
>     req = test_req()
>     req.input = { 'time' : 10 }
>     req.output = { 'ret' : 0, 'count' : 0 }
>     req.OK = 1
>
>     main(req)
>
>     print "Reached %d digests" % req.output['count']
>
>
> When I try to run this program in standalone into my Pentium Dual Core
> md4challenge reached 1.000.000 milion keys in 10 seconds but when i try to
> run this in embedded mode md5challenge reached about 200.000 more keys !!! I
> repeat this test many times and  always  wins  embedded mode  !!!  What's
> happen ?
>
> Also I tested to erase read dependencies from /dev/random, and calculate
> all keys from same buffer. In this case embedded mode win always also, and
> the difference are more bigger !!!
>
> Thks to all, can anybody help to me ?
> --
> Pau Freixes
> Linux GNU/User




-- 
Pau Freixes
Linux GNU/User
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20080608/a6936b1c/attachment.html>


More information about the Python-list mailing list