Python Locking Implementation (with threading module)
- by Matty
This is probably a rudimentary question, but I'm new to threaded programming in Python and am not entirely sure what the correct practice is.   
Should I be creating a single lock object (either globally or being passed around) and using that everywhere that I need to do locking?  Or, should I be creating multiple lock instances in each of the classes where I will be employing them.  Take these 2 rudimentary code samples, which direction is best to go?    The main difference being that a single lock instance is used in both class A and B in the second, while multiple instances are used in the first.  
Sample 1
class A():
    def __init__(self, theList):
        self.theList = theList
        self.lock = threading.Lock()
    def poll(self):
        while True:
            # do some stuff that eventually needs to work with theList
            self.lock.acquire()
            try:
                self.theList.append(something)
            finally:
                self.lock.release()
class B(threading.Thread):
    def __init__(self,theList):
        self.theList = theList
        self.lock = threading.Lock()
        self.start()
    def run(self):
        while True:
            # do some stuff that eventually needs to work with theList
            self.lock.acquire()
            try:
                self.theList.remove(something)
            finally:
                self.lock.release()
if __name__ == "__main__":
    aList = []
    for x in range(10):
        B(aList)
    A(aList).poll()
Sample 2
class A():
    def __init__(self, theList,lock):
        self.theList = theList
        self.lock = lock
    def poll(self):
        while True:
            # do some stuff that eventually needs to work with theList
            self.lock.acquire()
            try:
                self.theList.append(something)
            finally:
                self.lock.release()
class B(threading.Thread):
    def __init__(self,theList,lock):
        self.theList = theList
        self.lock = lock
        self.start()
    def run(self):
        while True:
            # do some stuff that eventually needs to work with theList
            self.lock.acquire()
            try:
                self.theList.remove(something)
            finally:
                self.lock.release()
if __name__ == "__main__":
    lock = threading.Lock()
    aList = []
    for x in range(10):
        B(aList,lock)
    A(aList,lock).poll()