Reputation: 686
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"
Upvotes: 1
Views: 2570
Reputation: 686
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()
Upvotes: 0
Reputation: 90889
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.
Upvotes: 1
Reputation: 11546
If you want to stick with classes (good idea):
Build two new classes, inheriting from myThread, having both their implementation of print_time function.
Upvotes: 0