I have a script and I want one function to run at the same time as the other.
The example code I have looked at:
import threading
def MyThread (threading.thread): # doing something........
def MyThread2 (threading.thread): # doing something........
MyThread().start()
MyThread2().start()I am having trouble getting this working. I would prefer to get this going using a threaded function rather than a class.
This is the working script:
from threading import Thread
class myClass(): def help(self): os.system('./ssh.py') def nope(self): a = [1,2,3,4,5,6,67,78] for i in a: print i sleep(1)
if __name__ == "__main__": Yep = myClass() thread = Thread(target = Yep.help) thread2 = Thread(target = Yep.nope) thread.start() thread2.start() thread.join() print 'Finished' 7 Answers
You don't need to use a subclass of Thread to make this work - take a look at the simple example I'm posting below to see how:
from threading import Thread
from time import sleep
def threaded_function(arg): for i in range(arg): print("running") sleep(1)
if __name__ == "__main__": thread = Thread(target = threaded_function, args = (10, )) thread.start() thread.join() print("thread finished...exiting")Here I show how to use the threading module to create a thread which invokes a normal function as its target. You can see how I can pass whatever arguments I need to it in the thread constructor.
4There are a few problems with your code:
def MyThread ( threading.thread ):- You can't subclass with a function; only with a class
- If you were going to use a subclass you'd want threading.Thread, not threading.thread
If you really want to do this with only functions, you have two options:
With threading:
import threading
def MyThread1(): pass
def MyThread2(): pass
t1 = threading.Thread(target=MyThread1, args=[])
t2 = threading.Thread(target=MyThread2, args=[])
t1.start()
t2.start()With thread:
import thread
def MyThread1(): pass
def MyThread2(): pass
thread.start_new_thread(MyThread1, ())
thread.start_new_thread(MyThread2, ())Doc for thread.start_new_thread
1I tried to add another join(), and it seems worked. Here is code
from threading import Thread
from time import sleep
def function01(arg,name): for i in range(arg): print(name,'i---->',i,'\n') print (name,"arg---->",arg,'\n') sleep(1)
def test01(): thread1 = Thread(target = function01, args = (10,'thread1', )) thread1.start() thread2 = Thread(target = function01, args = (10,'thread2', )) thread2.start() thread1.join() thread2.join() print ("thread finished...exiting")
test01() You can use the target argument in the Thread constructor to directly pass in a function that gets called instead of run.
Did you override the run() method? If you overrided __init__, did you make sure to call the base threading.Thread.__init__()?
After starting the two threads, does the main thread continue to do work indefinitely/block/join on the child threads so that main thread execution does not end before the child threads complete their tasks?
And finally, are you getting any unhandled exceptions?
2Python 3 has the facility of Launching parallel tasks. This makes our work easier.
It has for thread pooling and Process pooling.
The following gives an insight:
ThreadPoolExecutor Example
import concurrent.futures
import urllib.request
URLS = [' ' ' ' '
# Retrieve a single page and report the URL and contents
def load_url(url, timeout): with urllib.request.urlopen(url, timeout=timeout) as conn: return conn.read()
# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: # Start the load operations and mark each future with its URL future_to_url = {executor.submit(load_url, url, 60): url for url in URLS} for future in concurrent.futures.as_completed(future_to_url): url = future_to_url[future] try: data = future.result() except Exception as exc: print('%r generated an exception: %s' % (url, exc)) else: print('%r page is %d bytes' % (url, len(data)))Another Example
import concurrent.futures
import math
PRIMES = [ 112272535095293, 112582705942171, 112272535095293, 115280095190773, 115797848077099, 1099726899285419]
def is_prime(n): if n % 2 == 0: return False sqrt_n = int(math.floor(math.sqrt(n))) for i in range(3, sqrt_n + 1, 2): if n % i == 0: return False return True
def main(): with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)): print('%d is prime: %s' % (number, prime))
if __name__ == '__main__': main() the simple way to implement multithread process using threading
code snippet for the same
import threading
#function which takes some time to process
def say(i): time.sleep(1) print(i)
threads = []
for i in range(10): thread = threading.Thread(target=say, args=(i,)) thread.start() threads.append(thread)
#wait for all threads to complete before main program exits
for thread in threads: thread.join()