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áme dvě vlákna, která inkrementují sdílený čítač. Každé vlákno má čítač postupně zvýšit o 100 000. Očekávaná výsledná hodnota je 200 000, proč tomu tak ne vždy je?
Úkol
Vytvořte dvě vlákna, která se uspí 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
Mějme tři setřízená pole a
, b
, c
s celými čísly. Je známo, že některé číslo se vyskytuje v každém poli. Paralelně nalézněte nejmenší index i
, j
, k
pro které platí a[i] == b[j] == c[k]
, hodnoty vypište na obrazovku. Úkol lze vyřešit tak, že není nutné použít synchronizaci.
Ukázkový vstup problému
a = [3,4,5,6,7]
b = [1,2,5,7,9]
c = [3,4,6,7,9]
Ukázkový výstup
Thread 1 result: 7
Thread 2 result: 7
Thread 3 result: 7