Python – la concorrenza resa davvero facile con i decoratori

CYd

Ieri ho pubblicato un post dicendo che non sono capace a raccontare certe cose e, inaspettatamente almeno per me, ha avuto un pakko di visite.
Allora mi viene la voglia di insistere, chissà se anche oggi… 😉
Anche perché serendipicamente, dallo stesso ambiente del post di ieri, mi arriva una segnalazione davvero sexy invitante 😀 Ovviamente su qualcosa di cui più volte ho detto cose diverse da quelle di oggi, cambio idea, mi aggiorno 😀

Viene tutto da Decorated Concurrency – Python multiprocessing made really really easy sul blog di Peter Bengtsson, è un blog da seguire, imho.

Sì, finora dicevo di lasciar perdere i decoratori, poco intuitivi e difficilissimi da fare. Ma poi capita questo post che illustra un caso realistico reso facilissimo (davvero facilissimissimo) 😀
Nel post trovate la fonte e la documentazione, tutto OK.
Non mi resta che provarlo.

Per Ubuntu occorre installare il package deco con

sudo pip3 install deco

Ma probabilmente pip3 non è installato e allora

sudo apt-get install python3-pip

OK, tutto pronto, la versione non concorrente dell’esempio di Peter (nc.py):

import time

def slow(index):
    time.sleep(5)

def run():
    for index in list('123'):
        slow(index)
run()

nc

sì, troppo semplice, non si vede il consumo di CPU.

Ecco la versione concorrente (cd.py):

import time
from deco import concurrent, synchronized

@concurrent
def slow(index):
    time.sleep(5)

@synchronized
def run():
    for index in list('123'):
        slow(index)

run()

cd

OK, visto? tutto come previsto.

Cosa succede se i processi sono tanti, più delle CPU presenti? (tcd.py):

import time
from deco import concurrent, synchronized

@concurrent
def slow(index):
    time.sleep(5)

@synchronized
def run():
    for index in list('123456789'):
        slow(index)

run()

tcd

ovvio; conviene visualizzare il thread attivo con una piccola modifica (tcdp.py):

import time
from deco import concurrent, synchronized

@concurrent
def slow(index):
    print(index)
    time.sleep(5)

@synchronized
def run():
    for index in list('123456789'):
        slow(index)

run()

tcdp

ecco le scritte compaiono a gruppi di 4 (per 4 CPU); si dall’immagine non si vede ma provate, dai 😉

Quindi, conclusione personale, a volte servono anche i decoratori, non vale quanto detto in precedenza.

:mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: