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