2. cvičení - Základní paralelizace

Užitečné odkazy

Základy jazyka Python


    # Jednořádkový komentář začíná znakem #.

    """ Pro víceřádkový komentář se používá víceřádkový řetězec.
    """

    # 1. Datové typy a operátory

    # Čísla
    1, 2.0, 1e-4

    # Aritmetické operace
    1 + 3  # (Sčítání)
    2 - 1  # (Odčítání)
    3 * 2  # (Násobení)
    35 / 5 # (Dělení) Pozor vrací desetinné číslo!
    5 // 3 # (Celočíselné dělení)
    7 % 3  # (Modulo)
    2**2   # (Mocnění)

    # Logické hodnoty
    True
    False

    # Logické operace
    not True        # (Negace)
    True and False  # (Logický and)
    True or False   # (Logický or)

    # Porovnávání hodnot
    1 == 1  # (Rovnost)
    2 != 1  # (Nerovnost)
    10 < 2  # (Menší)
    2 > 10  # (Větší)
    2 <= 4  # (Menší nebo rovno)
    4 >= 2  # (Větší nebo rovno)


    # Řetězce
    "Ahoj Světe v uvozovkách"
    'Ahoj Světe v apostrofech'

    # Formátování
    "{}můžeme formátovat {}".format("Takto", "řetězce")

    # None
    None  # Ekvivalent NULL, nil


    # 2. Proměnné a kolekce

    # Použití fuknce print
    print("Hello World.")

    # Příkaz přiřazení
    # Názvy proměnných obsahují malá písmena a slova oddělujeme _ (podtržítko)
    kladne_cislo = 5

    # Seznam
    seznam = []
    seznam_s_hodnotami = [4, 5, 6]

    # Vložení prvku na konec seznamu
    seznam.append(1)
    seznam.append(2)

    # Odebrání prvku Z konce seznamu
    sez.pop()

    # Pro přístup k prvkům seznamu můžeme použít index
    seznam[0], seznam[-1] (postupujeme odzadu a -1 je poslední prvek)


    # Podseznamy
    seznam[1:3]  # Prvky mezi indexy 1 a 3 včetně.
    seznam[2:]   # Prvky od pozice 2 až po konec seznamu
    seznam[:3]   # První až třetí prvek seznamu

    # Odebrání prvku ze seznamu
    del seznam[2]

    # Délka seznamu
    len(seznam)

    # 3. Větvení programu, cykly

    # Konstrukce IF
    cislo = 2

    if cislo > 9:
        print("Číslo je víceciferné.")
    else if cislo % 2 == 0:
        print("Číslo je jednociferné a sudé.")
    else:
        print("Číslo je jednociferné a liché.")


    # Iterace přes seznam
    for cislo in [1, 2, 3]:
        print(cislo)

    # Iterace přes interval
    for i in range(10):
        print(i)

    for i in range(4, 8):
        print(i)

    # Cyklus while
    x = 0
    while x < 4:
        print(x)
        x += 1

    # 4. Funkce
    def factorial(n):
        if n == 0:
            return 1
        else:
            return n * factorial(n - 1)

    # volání funkce
    factorial(5)

Práce s vlákny


    # Importujeme třídu balíček pro práci s vlákny
    import threading

    # Importujeme funkci pro generování náhodných celých čísel
    from random import randint


    # Vytvoření vlákna
    # Konstrukrot třídy Thread bere jako argument funkci (callable object).

    def thread_print():
        print("Hello World!")

    thread = threading.Thread(target=thread_print)

    # Sputění nového vlákna
    thread.start()

    # Připojení nově vytvořeného vlákna k aktuálnímu.
    # Vlákno ve kterém bylo vytvořeno vlákno thread počká na dokončení
    # výpočtu vlákna thread.
    thread.join()


    # Předání hodnoty nově vytvořenému vláknu

    def thread_argument(text):
        print(text)

    thread = threading.Thread(target=thread_argument, args=("Hello World",))
    thread.start()
    thread.join()

    # Práce s globální proměnnou

    number = 10

    def add_value(n):
        # Musíme proměnnou number označit jako globální
        global number

        number += n

    thread = threading.Thread(target=add_value, args=(20,))
    thread.start()
    thread.join()

Úkoly

Napište program, kde budou alespoň 2 vlákna n-krát inkrementovat čítač. Za n zvolte dostatečně velké číslo.

Napište program, kde budou 2 vlákna každé z nich se uspí na náhodnou dobu a pak vypíše text na obrazovku.

Naprogramujte nasledující algoritmus, který vytvoří 10 procesů a každý proces výkoná níže uvedený program. Před implementací zkuste přijít na to co daný algoritmus dělá.


    # Globální hodnoty
    integer array[0..9] C # 10 po dvou různých hodnot
    integer array[0..9] D # Obsahuje samé 0
    -----------------------------------------------------
    Proces i = [0..9]:

    integer myNumber, count

    P1: myNumber <- C[i]
    P2: count <- Počet čísel z C menších než myNumber
    P3: D[count] <- myNumber

(Bodovaný) Naprogramujte paralelní násobení matic. Matice budeme reprezentovat pomocí seznamů.


    matrix_a = [[1, 2, 3], [4, 5, 6]]
    matrix_b = [[1, 2], [3, 4], [5, 6]]

    matrix_multiplication(matrix_a, matrix_b) # vrátí [[22, 28], [49, 64]]

Zdroje

[1] M. BEN-ARI, Principles of Concurrent And Distributed Programming, second edidion, 2006