Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check if current thread is main thread, in Python

This has been answered for Android, Objective C and C++ before, but apparently not for Python. How do I reliably determine whether the current thread is the main thread? I can think of a few approaches, none of which really satisfy me, considering it could be as easy as comparing to threading.MainThread if it existed.

Check the thread name

The main thread is instantiated in threading.py like this:

Thread.__init__(self, name="MainThread") 

so one could do

if threading.current_thread().name == 'MainThread' 

but is this name fixed? Other codes I have seen checked whether MainThread is contained anywhere in the thread's name.

Store the starting thread

I could store a reference to the starting thread the moment the program starts up, i.e. while there are no other threads yet. This would be absolutely reliable, but way too cumbersome for such a simple query?

Is there a more concise way of doing this?

like image 665
jonny Avatar asked Apr 21 '14 22:04

jonny


People also ask

How can you tell if a thread is main thread?

if(Looper. getMainLooper(). getThread() == Thread. currentThread()) { // Current Thread is Main Thread. }

How do I check if a main thread is alive in Python?

isAlive() . Then call is_main_thread_active() to check if the Main Thread is active.

Is Python multithreaded by default?

Multithreading in PythonBy default, your Python programs have a single thread, called the main thread. You can create threads by passing a function to the Thread() constructor or by inheriting the Thread class and overriding the run() method.


1 Answers

The problem with threading.current_thread().name == 'MainThread' is that one can always do:

threading.current_thread().name = 'MyName' assert threading.current_thread().name == 'MainThread' # will fail 

Perhaps the following is more solid:

threading.current_thread().__class__.__name__ == '_MainThread' 

Having said that, one may still cunningly do:

threading.current_thread().__class__.__name__ = 'Grrrr' assert threading.current_thread().__class__.__name__ == '_MainThread' # will fail 

But this option still seems better; "after all, we're all consenting adults here."

UPDATE:

Python 3.4 introduced threading.main_thread() which is much better than the above:

assert threading.current_thread() is threading.main_thread() 

UPDATE 2:

For Python < 3.4, perhaps the best option is:

isinstance(threading.current_thread(), threading._MainThread) 
like image 154
s16h Avatar answered Sep 17 '22 22:09

s16h