Python Tutorial on Multithreading

Discussion in 'Python' started by KevinSimonson, Feb 21, 2011.

  1. I've been teaching myself Python from the tutorial routed at "http://
    www.tutorialspoint.com/python/index.htm". It's worked out pretty
    well, but when I copied its multithreading example from the bottom of
    the page at "http://www.tutorialspoint.com/python/
    python_multithreading.htm" and tried to run it I got the error
    messages:

    C:\Users\kvnsmnsn\Python>python mt.py
    Traceback (most recent call last):
    File "mt.py", line 38, in <module>
    thread = myThread(threadID, tName, workQueue)
    File "mt.py", line 10, in __init__
    self.name = name
    File "C:\Python27\lib\threading.py", line 667, in name
    assert self.__initialized, "Thread.__init__() not called"
    AssertionError: Thread.__init__() not called

    I don't really understand why it's giving me these messages.
    <__initialized> gets set to <True> when <__init__()> gets called.
    Granted my Python program calls <__init__()> with only one parameter,
    and the constructor in "threading.py" takes _seven_ parameters, but
    all but one have default values, so a call with just one parameter
    should be legal. Why then is <__initialized> getting set to <True>?

    My code follows.

    Kevin Simonson

    import Queue
    import threading
    import time

    exitFlag = 0

    class myThread (threading.Thread):
    def __init__(self, threadID, name, q):
    self.threadID = threadID
    self.name = name
    self.q = q
    threading.Thread.__init__(self)
    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"
    KevinSimonson, Feb 21, 2011
    #1
    1. Advertising

  2. On 21.02.2011 23:30, KevinSimonson wrote:
    > I've been teaching myself Python from the tutorial routed at "http://
    > www.tutorialspoint.com/python/index.htm". It's worked out pretty
    > well, but when I copied its multithreading example from the bottom of
    > the page at "http://www.tutorialspoint.com/python/
    > python_multithreading.htm" and tried to run it I got the error
    > messages:
    >
    > C:\Users\kvnsmnsn\Python>python mt.py
    > Traceback (most recent call last):
    > File "mt.py", line 38, in<module>
    > thread = myThread(threadID, tName, workQueue)
    > File "mt.py", line 10, in __init__
    > self.name = name
    > File "C:\Python27\lib\threading.py", line 667, in name
    > assert self.__initialized, "Thread.__init__() not called"
    > AssertionError: Thread.__init__() not called
    >
    > I don't really understand why it's giving me these messages.
    > <__initialized> gets set to<True> when<__init__()> gets called.
    > Granted my Python program calls<__init__()> with only one parameter,
    > and the constructor in "threading.py" takes _seven_ parameters, but
    > all but one have default values, so a call with just one parameter
    > should be legal. Why then is<__initialized> getting set to<True>?
    >
    > My code follows.


    That tutorial seems to be wrong.

    According to the official docs:

    "If the subclass overrides the constructor, it must make sure to
    invoke the base class constructor (Thread.__init__()) before doing
    anything else to the thread."

    http://docs.python.org/library/threading.html#thread-objects

    So, change your __init__ to this:

    class myThread (threading.Thread):
    def __init__(self, threadID, name, q):
    threading.Thread.__init__(self)
    self.threadID = threadID
    self.name = name
    self.q = q


    HTH
    Alexander Kapps, Feb 21, 2011
    #2
    1. Advertising

  3. On Feb 21, 4:04 pm, Alexander Kapps <> wrote:
    >
    > That tutorial seems to be wrong.
    >
    > According to the official docs:
    >
    > "If the subclass overrides the constructor, it must make sure to
    > invoke the base class constructor (Thread.__init__()) before doing
    > anything else to the thread."
    >
    > http://docs.python.org/library/threading.html#thread-objects
    >
    > So, change your __init__ to this:
    >
    > class myThread (threading.Thread):
    >      def __init__(self, threadID, name, q):
    >          threading.Thread.__init__(self)
    >          self.threadID = threadID
    >          self.name = name
    >          self.q = q
    >


    Alexander, thanks! Your suggestion fixed my problem.

    Kevin S
    KevinSimonson, Feb 22, 2011
    #3
  4. KevinSimonson

    Terry Reedy Guest

    On 2/21/2011 7:02 PM, KevinSimonson wrote:
    > On Feb 21, 4:04 pm, Alexander Kapps<> wrote:
    >>
    >> That tutorial seems to be wrong.
    >>
    >> According to the official docs:
    >>
    >> "If the subclass overrides the constructor, it must make sure to
    >> invoke the base class constructor (Thread.__init__()) before doing
    >> anything else to the thread."
    >>
    >> http://docs.python.org/library/threading.html#thread-objects
    >>
    >> So, change your __init__ to this:
    >>
    >> class myThread (threading.Thread):
    >> def __init__(self, threadID, name, q):
    >> threading.Thread.__init__(self)
    >> self.threadID = threadID
    >> self.name = name
    >> self.q = q
    >>

    >
    > Alexander, thanks! Your suggestion fixed my problem.


    Please report the problem and solution on the tracker so the tutorial
    can be fixed.

    --
    Terry Jan Reedy
    Terry Reedy, Feb 22, 2011
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Rensjuh
    Replies:
    7
    Views:
    964
    Mabden
    Sep 2, 2004
  2. Ivan Voras

    Python, multithreading & GIL

    Ivan Voras, Apr 13, 2004, in forum: Python
    Replies:
    23
    Views:
    1,356
    Donn Cave
    Apr 15, 2004
  3. abhinav
    Replies:
    1
    Views:
    437
    Armin Steinhoff
    Feb 19, 2006
  4. W. Watson
    Replies:
    13
    Views:
    1,059
    W. Watson
    Sep 20, 2007
  5. Linuxmank
    Replies:
    36
    Views:
    1,488
    Linuxmank
    Aug 8, 2009
Loading...

Share This Page