1

Classes should be generic, right? I've got an example of multithreading using threading module, but it overrides the run method, so in fact this class can only create a thread connected to the print_time method. How can I make a thread of the same class, but connected to a different method, for example print_time_2?

#!/usr/bin/python

import threading
import time

exitFlag = 0

class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        print "Starting " + self.name
        print_time(self.name, self.counter, 5)
        print "Exiting " + self.name

def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            thread.exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1

def print_time_2(threadName):
    while True:
        print "Its me, %s" % (threadName)

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2) #how to connect this thread to print_time_2

# Start new Threads
thread1.start()
thread2.start()

print "Exiting Main Thread"
1
  • Classes should not be generic but concrete. Seriously, unless you define precisely what you mean with "generic", I can only assume the typical use of this word, and then it has its advantages and disadvantages. Commented May 31, 2015 at 9:50

3 Answers 3

1

Instead of creating your own thread class, you can import Thread class from threading module and then invoke it for functions (and specify arguments as necessary)

Example -

from threading import Thread

def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            thread.exit()
        time.sleep(delay)
        print "%s: %s" % (threadName, time.ctime(time.time()))
        counter -= 1

def print_time_2(threadName):
    while True:
        print "Its me, %s" % (threadName)

t1 = Thread(target=print_time, args=(1, "Thread-1", 1) )
t2 = Thread(target=print_time_2, args=("Thread-2" , ) )

t1.start()
t2.start()

document for python threading class - https://docs.python.org/2/library/threading.html

And yes, if args only consists of one argument, you need the last ',' as given in the example.

Sign up to request clarification or add additional context in comments.

1 Comment

Supporting deriving from the Thread class was a bad choice by Python in the first place, you don't derive from File in order to access a file either. Using this approach is a good advise!
0

If you want to stick with classes (good idea):

Build two new classes, inheriting from myThread, having both their implementation of print_time function.

2 Comments

But it generates a lot of code. Isn't it better to use one class to create multiple threads?
It does not generate more code than you wrote, only two new lines to put your to print functions in classes inheriting myThread.
0

Well, I have found this kind of solution to my problem. Could u comment on it, if it's good or bad? It works ok for me though...

import threading
import time

class FuncThread(threading.Thread):
    def __init__(self, target, *args):
        self._target = target
        self._args = args
        threading.Thread.__init__(self)

    def run(self):
        self._target(*self._args)

# Example usage
def someOtherFunc(data, key):
    while True:
        print "Thread 1: data=%s; key=%s" % (str(data), str(key))
        time.sleep(1)

def someOtherFunc2():
    while True:
        print "Thread 2"
        time.sleep(0.2)

t1 = FuncThread(someOtherFunc, [1,2], 6)
t2 = FuncThread(someOtherFunc2)
t1.start()
t2.start()

1 Comment

Still prefer my version but it clearly depend the context, divergence of implementations...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.