Threads
When you use time sleep your program cannot do anything else, unless you use threads. A single-thread program is like placing one finger on a line of code, then moving to the next. A multi-threaded program has multiple fingers.
def pause_task():
time.sleep(1)
print(threading.currentThread().name)
if __name__ == '__main__':
print('Main start -', threading.currentThread().name)
# Start new threads
thread = threading.Thread(target=pause_task, name='Second-Thread')
thread.start()
thread = threading.Thread(target=pause_task, name='Third-Thread')
thread.start()
thread = threading.Thread(target=pause_task) # default name
thread.start()
print('Main end -', threading.currentThread().name)
"""
Main start - MainThread
Main end - MainThread
Second-Thread
Third-Thread
Thread-20
"""
Arguments
You can pass target function's arguments.
import threading, time
def pause_task(file):
time.sleep(1)
print(f"File = {file} -", threading.currentThread().name)
if __name__ == '__main__':
print('Main start -', threading.currentThread().name)
# Start new thread
thread = threading.Thread(target=pause_task, name='Second-Thread', args=['myfile'])
thread.start()
print('Main end -', threading.currentThread().name)
"""
Main start - MainThread
Main end - MainThread
File = myfile - Second-Thread
"""
Concurrency
To avoid concurrency issues, never let threads change the same variable. When you create a new thread make sure its target function uses only local variable in that function.
import threading, time
name = 'A'
def incorrect_global_variable_task():
time.sleep(1)
global name # Look Here
print('Thread: ' + name)
name = threading.currentThread().name
print('Start')
threading.Thread(target=incorrect_global_variable_task, name='A').start()
threading.Thread(target=incorrect_global_variable_task, name='B').start()
print('End')
"""
Start
End
Thread: A
Thread: A
"""
myVar = 'A'
def correct_local_variable_task():
time.sleep(1)
myVar = threading.currentThread().name # local variable
print('Thread: ' + myVar)
print('Start')
threading.Thread(target=incorrect_global_variable_task, name='A').start()
threading.Thread(target=incorrect_global_variable_task, name='B').start()
print('End')
"""
Start
End
Thread: B
Thread: A
"""
Last update: 405 days ago