Välimuisti, Cloud functions, PostgreSQL, Avoin data - Pääteohjaus 6

Flask-Caching

Onko sovelluksesi hidas? Kestääkö jokin laskenta kauan? Tehdäänkö samoja hitaita asioita usein uudelleen? Käytä välimuistia ja sovelluksesi nopeutuu. Käytätkö kallista pilvipalvelua, jossa prosessointiaika tai tietokantaoperaatiot maksavat? Käytä välimuistiä ja säästät kustannuksissa.

Flask-Caching-kirjastolla saa flask-sovellukseen helposti välimuistin.

Firestore clients: To cache, or not to cache? (or both?)

Cloud Functions

Google tarjoamat pilvifunktiot (Cloud functions> ovat yksi mahdollisuus App enginen lisäksi rakentaa omia sovelluksia tai erityisesti sovelluksen osia. Jos on tarve yksittäiselle toiminnolle, voi sen hyvin toteuttaa cloud functiona. App Engine soveltuu paremmin kokonaisille Flask-sovelluksille ja sovelluksille joiden pitää vastata pyyntöihin nopeammin. Edellä toteutettu alkulkulaskenta olisi sopiva pilvifunktio. Pilvifunktioina voi toteuttaa myös taustalla toimivia funktioita. Hieman pilvifunktioita vastaava mahdollisuus on Cloud Run, jolla voi suorittaa pitempikestoisia sovelluksia kuin pilvifunktioita.

Pilvifunktiot ovat tilattomia. Periaatteessa pilvifunktion ympäristö käynnistetään tyhjästä (cold start) jokaisella funktion kutsukerralla. Tämä on myös hidasta eli funktio vastaa ensimmäisellä kutsukerralla hitaammin, kuin heti seuraavilla. Käytännössä sama toimintaympäristö (instanssi) on elossa jonkun aikaa funktion kutsumisen jälkeen. Samaa ympäristöä voidaan käyttää seuraavalla kutsulla tai sitten luodaan uusi. Saman instanssin vastatessa uudelleen tulee vastaus huomattavasti nopeammin. Kaikki mitä voi myöhemmin uudelleen käyttää kannattaa pitää instanssin muistissa tallessa globaaleina muuttujina. Vrt. App Enginen instanssit. Lue Tips & Tricks.

Kokeile mallia

from cachetools import cached, TTLCache
from cachetools.keys import hashkey

def main(request):
    n = request.args.get("n", 1)
    if n:
      return prime(n)
    else:
      return prime(2)

cache = TTLCache(maxsize=100, ttl=6000)

@cached(cache, key=hashkey)
def prime(n):
    if int(n) <= 1:
      return "[]"
    # hidas alkulukulaskenta-algoritmi
    # https://medium.com/@GalarnykMichael/prime-numbers-using-python-824ff4b3ea19
    primes = []
    for possiblePrime in range(2, int(n)):
    
        isPrime = True
        for num in range(2, possiblePrime):
            if possiblePrime % num == 0:
                isPrime = False
        if isPrime:
            primes.append(possiblePrime)
    return str(primes)

Cloud Run VS Cloud Functions: What’s the lowest cost?

Cloud functions vs App engine vs Cloud Run vs GKE

Cloud Run and Cloud Function: What do I use? And Why?

Cloud SQL

Ei pysty käyttämään appengine-sovelluksilla, jos käyttää python 2.7 -tulkkia. Voisi periaatteessa käyttää myös users.jyu.fi:ssä olevalla sovelluksella, mutta it-palvelut on estänyt tämän.

Avoin data

Käytetään muiden tekemiä XML-dokumentteja ja WWW-sivuja tiedonlähteenä.

DOM-rajapinta on tuttu jo TIEA2120 WEb-käyttöliittymien ohjelmointi -kurssilta. Jos olet unohtanut niin kertaa Document Object Model (DOM) ja Javascript ja DOM. Tässä pääteohjauksessa opetellaan DOM-rajapinnan käyttäminen Python-ohjelmointikielellä.

Ulkoisen XML-datan sisällyttäminen omalle sivulle

XML ja nimiavaruudet

XML-dokumenttiin voi olla sisällytetty elementtejä useasta eri nimiavaruudesta (namespace). Tämä täytyy osata huomioida dokumentin sisältöä käsiteltäessä. Käytetystä kirjastosta riippuen voi joutua käyttämään getElementsByTagNameNS-funktiota tavallisen getElementsByTagName-funktion sijaan. Esim.

mi = doc.getElementsByTagNameNS("http://www.w3.org/1998/Math/MathML", "mi")

Käyttämällä nimiavaruuden osaavaa versiota varmistaa, että ei ainakaan saa vahingossa tulokseen vääriä elementtejä. Eri nimiavaruuksissa voi olla samannimisiä elementtejä.

Joskus XML-dokumenteissa on myös CDATA-osioita, joiden parsiminen täytyy joillakin kirjastoilla tehdä poikkeavasti:

if node.firstChild.nodeName == "#cdata-section":
    print node.firstChild.data
else:
    print node.firstChild.nodeValue

ElementTree

Voit halutessasi opetella käyttämään myös ElementTree XML API-rajapintaa. ElementTree-rajapinnan käyttäminen on hieman yksinkertaisempaa kuin DOM-rajapinnan. ElementTree-rajapintaa tarvitset, jos joudut parsimaan rakenteeltaan rikkinäisiä html-dokumentteja (tagsoup...). Tällöin käytetään esimerkiksi BeautifulSoup-kirjastoa, joka toteuttaa ElementTree-rajapinnan.

Käyttäjien kommentit

Kommentoi Lisää kommentti
Informaatioteknologia - Jyväskylän yliopiston informaatioteknologian tiedekunta