En Mon, 29 Dec 2008 05:56:10 -0200, k3xji <sum...@gmail.com> escribió:

I  am trying to see on which situations does the Read-Write Lock
performs better on primitive Lock() itself. Below is the code I am
using to test the performance:
import threading
import locks
import time

class mylock(object):

(I'm not convinced your lock is correct)

GLOBAL_VAR = 1
#GLOBAL_LOCK = locks.ReadWriteLock()
GLOBAL_LOCK = threading.Lock()
#GLOBAL_LOCK = mylock()
GLOBAL_LOOP_COUNT = 100000
GLOBAL_READER_COUNT = 1000
GLOBAL_WRITER_COUNT = 1

Only one writer? If this is always the case, you don't need a lock at all.

class wthread(threading.Thread):
    def run(self):
            try:
                #GLOBAL_LOCK.acquireWrite()
                #GLOBAL_LOCK.acquire_write()
                GLOBAL_LOCK.acquire()
                for i in range(GLOBAL_LOOP_COUNT):
                    GLOBAL_VAR = 4
            finally:
                #GLOBAL_LOCK.release_write()
                GLOBAL_LOCK.release()

Note that the thread acquires the lock ONCE, repeats several thousand
times an assignment to a *local* variable called GLOBAL_VAR (!), finally
releases the lock and exits. As every thread does the same, they just run
one after another, they never have a significant overlap.

Also, you should acquire the lock *before* the try block (you have to
ensure that, *after* acquiring the lock, it is always released; such
requisite does not apply *before* acquiring the lock)

I'd test again with something like this:

class wthread(threading.Thread):
     def run(self):
         global GLOBAL_VAR
         for i in xrange(GLOBAL_LOOP_COUNT):
             GLOBAL_LOCK.acquire()
             try:
                 GLOBAL_VAR += 1
             finally:
                 GLOBAL_LOCK.release()

class rthread(threading.Thread):
    def run(self):
            try:
                #GLOBAL_LOCK.acquireRead()
                #GLOBAL_LOCK.acquire_read()
                GLOBAL_LOCK.acquire()
                for i in range(GLOBAL_LOOP_COUNT):
                    GLOBAL_VAR = 3
            finally:
                #GLOBAL_LOCK.release_read()
                GLOBAL_LOCK.release()

Hmmm, it's a reader but attempts to modify the value?
You don't have to protect a read operation on a global variable - so a
lock isn't required here.

What I am doing is: I am creating multiple readers and try to do
something. I had assumed that with using primitive Lock() on the above
situation, it will create a bottleneck on the rthreads. But the
numbers indicate that there are no difference at all. I had
implemented my own READ-WRIET lock as can be seen above mylock and
also used the one here: code.activestate.com/recipes/502283/.

I hope you now understand why you got the same numbers always.

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to