My program is designed in the following way:
imshow
method. Also, I am storing the video from the IP Camera.Question: I have the algorithms in place, the problem is I need to run both these in a while loops. The condition is that I cannot exit from any of them. Now threading is a good alternative for this but I have read about the GIL, so how do I go about running two infinite loops?
from multiprocessing import Process
def methodA():
while TRUE:
do something
def methodB():
while TRUE:
do something
p=Process(target=methodA())
p.start()
p1=Process(target=methodB())
p1.start()
Now when I start process p
it starts executing, after that how do I start p1
to run simultaneously?
You can create two different threads that will run these infinite loops for you. The first thread will perform your task1 and second one will perform task2. Also, once I start executing a thread, how do I execute the other thread when the first thread is running continuously/infinitely?
We can create an infinite loop using while statement. If the condition of while loop is always True , we get an infinite loop.
To recap, threading in Python allows multiple threads to be created within a single process, but due to GIL, none of them will ever run at the exact same time. Threading is still a very good option when it comes to running multiple I/O bound tasks concurrently.
If the Python program outputs data, but you never see that output, that's a good indicator you have an infinite loop. You can test all your functions in the repl, and the function that does "not come back" [to the command prompt] is a likely suspect.
As far as I understood your question, you have two different tasks that you want them to perform continuously. Now regarding your questions:
how do I go about running two infinite loops?
You can create two different threads that will run these infinite loops for you. The first thread will perform your task1 and second one will perform task2.
Also, once I start executing a thread, how do I execute the other thread when the first thread is running continuously/infinitely?
If you are using two different threads then you don't need to be worried about this issue. If the threads are not sharing any resource then you don't need to worry about this fact. How ever if you want to stop/pause one thread from the other thread or vice versa then you can implement a mechanism using flags or locks. These questions will help in this case:
Is there any way to kill a Thread in Python?
Why does the python threading.Thread object has 'start', but not 'stop'?
making-a-program-munltithreaded
Sample example using threading:
from threading import Thread class myClassA(Thread): def __init__(self): Thread.__init__(self) self.daemon = True self.start() def run(self): while True: print 'A' class myClassB(Thread): def __init__(self): Thread.__init__(self) self.daemon = True self.start() def run(self): while True: print 'B' myClassA() myClassB() while True: pass
For shared resources?
Use Locks for them. Here are some examples. One, two and How to synchronize threads in python?
what if I don't want to run it using classes? How do I do this using only methods?
from threading import Thread def runA(): while True: print 'A\n' def runB(): while True: print 'B\n' if __name__ == "__main__": t1 = Thread(target = runA) t2 = Thread(target = runB) t1.setDaemon(True) t2.setDaemon(True) t1.start() t2.start() while True: pass
from threading import Thread
import time
class PrintA(Thread):
def __init__(self):
Thread.__init__(self)
self.running = True
def run(self):
while self.running:
print('A')
time.sleep(1)
def stop(self):
self.running = False
class PrintB(Thread):
def __init__(self):
Thread.__init__(self)
self.running = True
def run(self):
while self.running:
print('B')
time.sleep(2)
def stop(self):
self.running = False
a = PrintA()
b = PrintB()
a.start()
b.start()
time.sleep(10)
a.stop()
time.sleep(10)
b.stop()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With