Ich versuche zu verstehen, wie das Schauspielermodell funktioniert, indem es eine Bank modelliert. Zunächst ein Code, der veranschaulicht, warum wir Modelle für konkurrierende Systeme benötigen:
%Vor% Nach dem Ausführen des Codes sollte der Kontostand für 'joe'
nach fünf Sekunden -60
sein. Der Grund dafür ist, dass bank
nicht vor gleichzeitigem Zugriff geschützt ist und das Pausieren für fünf Sekunden während der gleichzeitigen Ausführung bedeutet, dass wir nicht garantieren können, dass auf die Daten nicht in verschiedenen Zuständen zugegriffen wird. In diesem Fall greift der erste Thread auf die Bank zu, nachdem der zweite Thread die Entnahme beendet hat, prüft jedoch nicht, ob eine Entnahme noch möglich ist. Als Ergebnis wird das Konto negativ.
Wenn wir die Bank und Abhebungen als Akteure modellieren, können wir den Zugriff auf das Konto schützen, da sein Status auf einem anderen Thread verwaltet wird, der von denen getrennt ist, die versuchen, sich aus dem Konto zurückzuziehen.
%Vor%Lass uns jetzt testen:
%Vor%Stimmt dieses Verständnis? Obwohl die Bank während der Auszahlungen schläft, kann eine gleichzeitige Auszahlung die Daten nicht beschädigen, da sie in einem anderen Thread verwaltet wird als die Auszahlungen.
Das gleichzeitige Zurückziehen kann nicht mehr auftreten, stimmt aber, weil die Nachrichten withdraw
seriell und nicht gleichzeitig vom einzelnen Bank
-Thread innerhalb der Bank.read_messages
-Schleife behandelt werden. Dies bedeutet, dass die sleep
-Befehle auch seriell ausgeführt werden; Die gesamte Nachrichtenwarteschlange wird abgewürgt und für 2 Sekunden gesteuert, wenn die Bank während einer Auszahlung schlafen muss. (Angesichts der modellierten Wirkung von Bank
ist dies im Wesentlichen unvermeidbar.)
Wenn der Zugriff auf ein Objekt zu einem einzelnen Thread isoliert ist, wird es im Allgemeinen als threadsicher angesehen.
Die anderen Akteure können nicht direkt auf den Speicher der Bank zugreifen, sondern nur Nachrichten senden, die eine Auszahlung anfordern, so dass Aktualisierungen nur im Bank-Thread stattfinden und die Check-and-Set-Race-Bedingung im ursprünglichen Design eliminiert wird.
Tags und Links multithreading actor