Základní práce s vlákny
Užitečné odkazy
Objekt Thread
Thread
třída reprezentuje aktivitu běžící v separátním vlákně. Jsou zde dvě možnosti jak objektu Thread
specifikovat aktivitu: předání callable object
do konstruktoru třídy Thread
, nebo přepsání metody run()
. Pro jednoduchost budeme používat první možnost.
1
2
3
4
5
6
7
8
import threading
def example_activity():
print("Hello World")
example_thread = threading.Thread(target=example_activity)
example_thread.start()
Při vytváření objektu Thread
je rovněž možné předat aktivitě argumenty.
1
2
3
4
5
6
7
8
import threading
def example_activity_with_args(number):
print(f"Your number is {number}")
example_thread = threading.Thread(target=example_activity_with_args, args=(10,))
example_thread.start()
Modifikace globální proměnné v rámci vlákna
Pokud potřebujeme modifikovat proměnnou v rámci vlákna musíme použít klíčové slovo global
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import threading
text = 'ahoj '
def thread_function():
global text
text += 'svete'
thread = threading.Thread(target=thread_function)
thread.start()
thread.join()
print(text)
Problém sdíleného čítače
Mějme dvě vlákna, která postupně inkrementují sdílený čítač. Každé vlákno má čítač postupně zvýšovat o 10 (po jednom). Očekávaná výsledná hodnota je 20.
Aby bylo možné jednoduše pozorovat problém, provádějte změnu čítače následujícím způsobem:
1
2
3
4
5
6
7
8
9
import time
# ...
local_counter = counter
time.sleep(0.0001)
local_counter += 1
time.sleep(0.0001)
counter = local_counter
# ...
Správnost čítače lze testovat pomoci assert
.
1
assert counter == 20
Úkol
Vytvořte dvě vlákna, která se uspí (jak uspat Python) na náhodně dlouhou dobu (v rozsahu několika sekund) a vypíší výstup na obrazovku.
Úkol
Naprogramujte úlohu sdíleného čítače a vyzkoušejte zda opravdu nefunguje.
Úkol
Naprogramujte úlohu sdíleného čítače, kde je možné specifikovat počet vláken inkrementující sdílený čítač (Příjmout úkol).