asynchron und parallel - lichtkind.de · herbert breunung u.a. heise.de lichtkind.de/vortrag...

70
Perl 6 asynchron und parallel

Upload: others

Post on 06-Sep-2019

19 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Perl 6

asynchron und parallel

Page 2: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Perl 6

KonzepteSchlüsselworte, Ops

Anwendung

Page 3: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

mein Hauptprojekt ...

Page 4: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Herbert Breunung

ArtikelautorRedner

ModeratorProgrammierer

Page 5: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Herbert Breunung

u.a. heise.delichtkind.de/vortrag

de.perl.orggithub bitbucket CPAN

Page 6: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Herbert Breunung

u.a. heise.delichtkind.de/vortrag

de.perl.orgmodules.perl6.org

Page 7: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

wichtige URL:

perl6.orgdocs.perl6.org

rakudo.orgmodules.perl6.org

Page 8: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Perl 6

6.c Christmas 2015

6.d Diwali 2018

Page 9: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Perl 6

use v6.c;use v6.d;

use v5.28;

Page 10: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Perl 6 – Hauptfunkt.

Grammatiken +

Meta-programmierung

Page 11: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Jonathan Worthinton

jnthn.net

Page 12: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Begriffsklärung

asynchronberlappendes Start Endeü

parallelgleicher Start

Page 13: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Beschleunigung:

asynchronoptimale Nutzung 1 Kern

parallelOpt. Nutzung 2+ Kerne

Page 14: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Begriffsklärung

asynchronnicht deine Entscheidung

paralleldeine Entscheidung

Page 15: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Konzepte:

LL: Lock Semaphor Thread Modul: Actor

HL: PromiseSupply Channel

Page 16: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Dieser Vortrag:

LL: Lock Semaphor Thread Modul: Actor

HL: PromiseSupply Channel Ops

Page 17: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

High Level Konzepte:

langsamerschränkte ein

sicherdeklarativ

standardisiert

Page 18: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Low Level Konzepte:

goto SpeicheradresseSpeicher allokierenReferenzadressen

umbiegen

Page 19: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Perl 6 Threads

Thread

Page 20: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Klasse Thread:my @threads = do for 1.. 5 → $id { Thread.start: { say "starte $id"; sleep 1; say "Schüss $id"} }.join for @threads;

Page 21: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Klasse Thread:starte 1starte 2

...Schüss 2Schüss 1Schüss 3Schüss 4Schüss 5

Page 22: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Klasse Thread:

Thread.start: {say "start $id - $*THREAD.id"; ...}

Page 23: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Scheduler:for 1..10 → $i { $*SCHEDULER.cue: { say "start $i"; sleep 0.5; say "schüss $i"} }

Page 24: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Parallelität:

race: Reihenfolge unwichtig

hyper : Reihenfolge !

Page 25: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Parallelität:

say ^100000 .grep(*.is-prime) .elems;

Page 26: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Parallelität:

say (grep({$_.is-prime}, 0..99999) ).elems;

Page 27: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Parallelität:

say ^100000 .race .grep(*.is-prime) .elems;

Page 28: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Parallelität:

say ^100000 .race(:1024batch, :12degree) .grep(*.is-prime) .elems;

Page 29: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Reihenfolge !

say ^100000 .hyper(:1024batch, :12degree) .grep(*.is-prime) .elems;

Page 30: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Hyperops:

say (1,2,3) »+« (4,5,6);

# OUTPUT: «(5 7 9)»

Page 31: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Datenstrukturen:

Concurrent::Queue Concurrent::Stack Concurrent::Trie

Page 32: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Perl 6 Asynchron

Page 33: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Asynchron

Sachsenspiegel:

Die ok irst to der molen kumt, die sal erst malen

Page 34: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Klasse Lock:

my $l = Lock.new;$l.lock; # Tür zu$l.unlock;$l.protect: {...}; #atom.

Page 35: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Operator:

'ATOM SYMBOL' (U+269B)

Page 36: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Klasse Lock:

Verklemmung

Page 37: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Semaphore:

my $s = Semaphore.new;$s.acquire;$s.try_acquire;$s.release;

Page 38: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Semaphore:

Verklemmung

Page 39: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Klasse Monitor:

use OO::Monitors;

monitor Name {..} # statt

class Name {...}

Page 40: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Klasse Actor:

use OO::Actors;

actor Eventlog {..} # statt

class Eventlog {...}

Page 41: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Klasse Actor:

use OO::Actors;

actor Eventlog {...}

Methoden geben Versprechen

Page 42: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Promise:

my $p = Promise.start;

my $p = start {...}

Page 43: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Promise:

my $p = Promise.in(2);

Promise.at(now +2) .then({ say "kling" });

Page 44: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Promise:

$p.keep(“Ergebnis“);$p.break(“Grund“);

$p.cause;

Page 45: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Promise:

$p.status ~~ Kept$p.Bool if $p {..$p.result # hab Zeitawait

Page 46: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Sortieralgorithmus

sub parallel-merge-sort (@values, $from = 0, $elems = @values.elems){

my $divide = ( $elems / 2).ceiling; my ($left, $right) = await (start parallel-merge-sort(@v,$from,$divide), start parallel-merge-sort(@v,$f+$div, $el-$d)); merge $left, $right;}

Page 47: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Sortieralgorithmus

In Perl 6.d werden dabei nur soviel Threads erzeugt wie Kerne vorhanden

Page 48: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Promise:

$p.allof( @p );$p.anyof( @p );

$p.vow( $o );$s = $p.Supply( );

Page 49: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Promise:my @parsers = (start parse $to-parse, $to-search) xx 8;

Promise.allof(@parsers) .then({ $to-search.close });

Page 50: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Supply

Muster:Beobachter

Page 51: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Supply

.live True

on demand

Page 52: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Supply

zuhören

fordern

Page 53: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Supply

Absender zahlt

Page 54: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Channel

Absender zahlt

Empfänger zahlt

Page 55: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Supplier

my $sender = Supplier.new();

my $leitung = $sender.Supply;

Page 56: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Supplier

my $sender = Supplier.new();my $leitung = $sender.Supply;

$leitung.tap(-> $v { say "$v" });$sender.emit( 7331 );$leitung.list();

Page 57: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Sequence Op

put (1, 1, *+* ... *)

Page 58: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Sequence Op

put (1, 1, *+* ... *)[0..10]

1 1 2 3 5 8 13 21 34 55 89

Page 59: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Endlosschleife

my @fib = (1, 1, *+* ... *);my $leitung = Supply.from-list(@fib);

$leitung.tap(-> $v { say $v });

Page 60: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Beziehungen

Promise: $ 1 - 1

Supply: @ 1 - *

Channel: @ 1 - 1

Page 61: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Channel:

my $c = Channel.new();

$c.send('Nachricht'); # !blsay $c.recieve; # blockt say $c.list; # blocktsay $c.poll; # blockt nicht

Page 62: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Channel:

$c.send('Nachricht');say $c.recieve; say $c.close; await( @c );

Page 63: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Feed Operator:

<people of earth> ==> map(*.tc) ==> grep /<[PE]>/ ==> sort() ==> @result;

Page 64: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

whenever:

for @liste → $i {…}

$var = whenever {...}

Page 65: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

whenever:

for @liste → $i {…}

$var = whenever {...}

Page 66: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

react:

react {…}

# wartet bis alle# Kanäle geschlossen

Page 67: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

supply:

supply {…}

# ermöglicht ständige# Abfragen

Page 68: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

whenever:

react { whenever {...} whenever {...}}

Page 69: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

whenever:whenever $client.get($url) -> $response { if $response.content-type .type-and-subtype eq 'text/html' {...} QUIT {

note "$url failed: " ~ .message; } }

Page 70: asynchron und parallel - lichtkind.de · Herbert Breunung u.a. heise.de lichtkind.de/vortrag de.perl.org github bitbucket CPAN

Danke