Was ist der Sinn von Fasern in Ruby?

8

Ich verstehe nicht, wie das folgende:

%Vor%

Ist so viel schlimmer als:

%Vor%     
Senjai 20.05.2013, 20:53
quelle

1 Antwort

24

Fasern sind eine Möglichkeit, beliebige Code-Blöcke zu unterbrechen und wieder aufzunehmen. Ein solches Beispiel ist nicht wirklich ein großartiger Anwendungsfall, da es keinen wirklichen Vorteil gegenüber der herkömmlichen Art bietet, Zeilen zu lesen und zu verarbeiten.

Wenn Sie es in diesem speziellen Beispiel verbessern wollten, würden Sie eine Schnittstelle im Enumerator-Stil schreiben, so dass Sie schreiben könnten:

%Vor%

Wo Fasern wichtig werden, schreiben wir asynchronen Code. Zum Beispiel müssen Sie innerhalb der EventMachine Umgebung einen asynchronen Aufruf durchführen, einen Block Code anhalten und ihn fortsetzen, wenn Sie den Code erhalten Antwort.

Das sieht dann so aus:

%Vor%

Diese Art verschachtelter, verschachtelter und neu verschachtelter Call-Struktur wird als "Callback-Hölle" bezeichnet, da es sehr schwierig wird, sie zu verwalten, sobald Ihre Logik nicht trivial wird. Eine Möglichkeit, diese Struktur abzuflachen, besteht darin, Fasern zu verwenden. Ein richtiges Fiber-ites Äquivalent ist:

%Vor%

Fasern können Ausnahmeregelungen nutzen, bei denen Code vom Rückruftyp nicht möglich ist. Ausnahmen können, wenn sie effektiv verwendet werden, einen Codeblock massiv vereinfachen, wie Sie hier sehen können. Statt für ok? auf jeder Antwort zu testen, wird erwartet, dass der Aufruf stattdessen eine Ausnahme vom Typ NotOkay auslöst.

Callbacks können keine Ausnahmen zuverlässig auslösen, da der Initiator des Aufrufs bereits beim Callback nicht mehr in der Reichweite ist. Dies ist eine grundlegende Einschränkung der asynchronen Programmierung mit Rückrufen. Fiber-gesteuerter Code behält einen ordnungsgemäßen Aufruf-Stack bei, er wird lediglich angehalten und unverändert fortgesetzt, so dass Exceptions den Aufrufer ordnungsgemäß kaskadieren.

Ich habe herausgefunden, dass Fasern sowohl einfach zu verstehen als auch sehr schwierig anzuwenden sind. In den meisten Fällen müssen Sie sie nicht direkt verwenden. Sie verwenden stattdessen eine Bibliothek, die sie verwendet. Das Schreiben von "Fiber-aware" -Code ist dem Schreiben von "Thread-safe" -Code ähnlich. Es kann schwierig sein, richtig zu machen.

    
tadman 20.05.2013, 21:10
quelle