Sočasen dostop do podatkovne baze (simulacija z večnitnim programom)


Napišite program v Pythonu, ki bo implementiral funkcije za spodaj opisane naloge. Natančno se držite navodil, saj vam bo rešitev služila kot osnova za četrto domačo nalogo (transakcije).

Vsaka od funkcij naj uporablja lastno povezavo do baze in ima približno naslednjo strukturo.

def funkcija(...):
    # Povezava na bazo, klic vaše funkcije
    connection = connect(...)
    try:
        cursor  = connection.cursor()
        # telo funkcije
    except Exception, exc:
        # Obravnava napak, lahko izboljšate
        print "EXCEPTION", exc
    # Zapiranje povezave
    connection.close()

(a). Funkcija connect, ki izvede povezavo na bazo. Funkcija naj se poskuša povezati z bazo. Če ji to ne uspe, naj počaka eno sekundo in poskuša ponovno, dokler ne uspe. Vrne dejansko povezavo na bazo.

def connect(connection-string):
    ...
    return connection

Čakanje izvedite na naslednji način.

import time
...
time.sleep(x) # Čaka x sekund


(b). Funkcija create, ki kreira tabelo s podanim imenom (parameter), npr. sandbox.test. Kreirana tabela naj vsebuje naslednje atribute: id , ime, priimek, ocena. id in ocena naj bosta celoštevilčna, ime in priimek pa znakovna spremenljive dolžine. V tabelo vstavite natanko 10 vrstic s smiselnimi imeni in priimki, id naj gre od 1 do 10, oceno pa izračunate po naslednji formuli v Pythonu: 5+((id*101) % 6)

def create(table-name="sandbox.test"):
    ...


(c). Funkcija select, ki izpiše na zaslon vsebino tabele s podanim imenom (parameter).

def select(table-name ...):
    ...

(d). Funkcija long_query, ki izračuna povprečno oceno iz dane tabele na način, da izvede 10 SELECT stavkov (za vsak id svojega). Po vsakem selectu čaka eno sekundo. Na koncu izpiše in vrne rezultat.

def long_query(table-name ...):
    ...
    povp = 0
    for id in range(1,11):
        # SELECT za id
        ocena = ...
        povp += ocena
        # Čakaj eno sekundo
    ...
    print "POVP. OCENA", povp
    return povp

(e). Funkcija update, ki za podani id oceno poveča za 1 (po modulu 10 + 1)

def update(id):
    ...
    # SELECT ... prebere oceno
    ocena = 1 + (ocena + 1) % 10  # spremeni oceno
    # Čakaj eno sekundo
    # UPDATE ...  # Zapiše spremenjeno oceno
    ...


(f). S pomočjo napisanih funkcij izvedite naslednji skiciran testni program.

def test1():
    create("sandbox.test")
    select("sandbox.test")
    for id in range(1,11):
        update(id)
    select("sandbox.test")
    for id in range(1,11):
        update(1)
    select("sandbox.test")

(g). S pomočjo Pythonovega modula threading napišite funkcijo test2, kjer se vsak klic vaših podprogramov (create, select, update) izvede v svoji niti. Kakšna je razlika v izpisu?

Šablona za večnitno programiranje v Pythonu (modul threading).

import time
import threading

t = threading.Thread(target=funkcija1)
t.start() # Sele tu se funkcija1 zacne izvajati v svoji niti

for i in range(100):
   t = threading.Thread(target=funkcija2,args=(arg1,arg2,...,arg_n))

   t.start()

# Počakaj, da se vse niti zaključijo
while threading.activeCount()>1:
   print "ACTIVE", threading.activeCount()
   time.sleep(1)

Last modified: Wednesday, 9 December 2015, 1:14 AM