title: Should I bother locking the queue when I put to or get from it?
body: <p>I've been gong through the tutorials about multithreading and queue in python3. As the <a href="https://docs.python.org/3.6/library/queue.html" rel="noreferrer">official tutorial</a> goes, "The Queue class in this module implements all the required locking semantics". But in <a href="https://www.tutorialspoint.com/python3/python_multithreading.htm" rel="noreferrer">another tutorial</a>, I've seen an example as following:</p>
  
  <pre><code>import queue
  import threading
  import time
  
  exitFlag = 0
  
  class myThread (threading.Thread):
     def __init__(self, threadID, name, q):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.q = q
     def run(self):
        print ("Starting " + self.name)
        process_data(self.name, self.q)
        print ("Exiting " + self.name)
  
  def process_data(threadName, q):
     while not exitFlag:
        queueLock.acquire()
        if not workQueue.empty():
           data = q.get()
           queueLock.release()
           print ("%s processing %s" % (threadName, data))
        else:
           queueLock.release()
           time.sleep(1)
  
  threadList = ["Thread-1", "Thread-2", "Thread-3"]
  nameList = ["One", "Two", "Three", "Four", "Five"]
  queueLock = threading.Lock()
  workQueue = queue.Queue(10)
  threads = []
  threadID = 1
  
  # Create new threads
  for tName in threadList:
     thread = myThread(threadID, tName, workQueue)
     thread.start()
     threads.append(thread)
     threadID += 1
  
  # Fill the queue
  queueLock.acquire()
  for word in nameList:
     workQueue.put(word)
  queueLock.release()
  
  # Wait for queue to empty
  while not workQueue.empty():
     pass
  
  # Notify threads it's time to exit
  exitFlag = 1
  
  # Wait for all threads to complete
  for t in threads:
     t.join()
  print ("Exiting Main Thread")
  </code></pre>