Zwierzak
Zwierzak

Reputation: 686

Creating threads from the same class but with different methods connected in Python

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

Answers (3)

Zwierzak
Zwierzak

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

Anand S Kumar
Anand S Kumar

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

Julien Palard
Julien Palard

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

Related Questions