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).