Python 3, threading and references
Last updated: Jan 24, 2023
Creating a thread
I used threading to enable real-time graphing of data from sensors. One thread collected data from the sensors. The main thread ran the real time graph. I had a few problems getting started. It came down to my incorrect use of brackets when creating the thread.
When we create a thread using the threading library, we need to pass the target to the thread without using brackets. e.g.
thread = threading.Thread(target=ThreadTest)
thread = threading.Thread(target=ThreadTest())
Otherwise the target is created in the main thread, which is what we are trying to avoid. Without the brackets, we pass a reference to the target. With the brackets, we have already created the object. I think that this is analogous to passing a pointer in C, but stand to be corrected.
In test1.py I call ThreadTest without using brackets. test_thread starts in the thread and allows test1.py to continue running.
In test2.py, I pass ThreadTest() as the target. In this case the thread does not allow test2.py to continue running.
import threading from thread_test import ThreadTest thread = threading.Thread(target=ThreadTest) thread.start() print('not blocked')
import threading from thread_test import ThreadTest thread = threading.Thread(target=ThreadTest()) thread.start() print('not blocked')
from time import sleep class ThreadTest(): def __init__(self): print('thread_test started') while True: sleep(1) print('test_thread')
output from test1.py:
thread_test started not blocked test_thread test_thread test_thread
output from test2.py:
thread_test started test_thread test_thread test_thread