2010-12-15 10 views
32

Ich habe über den neuen IO-Manager in GHC gelesen, der asynchrone Ereignisbenachrichtigungen verwendet und vermeidet, dass I/O blockiert wird, um einen hohen Durchsatz zu erreichen.Welche IO-Aktivität unterstützt der GHC IO-Manager?

Welche E/A-Aktivitäten können mit dem neuen asynchronen E/A-Code verwaltet werden? Lesen und Schreiben von Dateien und Netzwerkaktivitäten? Datenbankzugriff? Gibt es Arten von IO, wo der Manager auf Blockieren zurückgreifen muss?

+2

Wow ... 4 Favoriten, aber nur ein upvote. Das ist seltsam. – fuz

+0

@FUZxxl StackOverflow hat Favoriten? Das habe ich aufgrund deines Kommentars nur gemerkt. – alternative

+0

@monadisch Ja, gibt es. Drücken Sie einfach den Startknopf direkt unter einer Frage, um es zu favorisieren. Wenn sich etwas ändert, erhalten Sie eine Benachrichtigung, als ob es Ihre eigene Frage ist. – fuz

Antwort

26

Jeder Dateideskriptor, der von epoll/kqueue verwaltet werden kann, ist berechtigt. Bibliotheken, die asynchrone Behandlung von Ich möchte/O benötigen von

  • machen Filedeskriptoren non-blocking und
  • Aufruf der threadWaitRead und threadWaitWrite Funktionen in GHC.Conc bevor erneut versucht, einen Systemaufruf mit dem I/O-Manager zusammenarbeiten, dass zuvor zurückgegeben .

Dies wurde bereits für die Typen Handle und Socket durchgeführt. Wenn Sie z.B. Bei einer Bindung an eine C-Datenbankbibliothek erhalten Sie ein Blockierungsverhalten, da diese Bibliothek nicht mit dem E/A-Manager zusammenarbeitet.

+8

Darf ich bemerken, dass 'tibbe' wahrscheinlich * die * wissende Person in diesem Bereich ist :) –

5

Eine etwas befriedigende Antwort:

Das Herz des neuen GHC IO Managers ist eine kqueue()/epoll() Ereignisschleife. Ich würde also erwarten, dass alles, was darauf aufgebaut werden kann, berechtigt ist - wenn nicht jetzt, dann später. Insbesondere bedeutet dies:

  • Datei IO
  • Netzwerk IO

Der Code (ich sah es vor einigen Monaten und die Dinge geändert haben könnten) enthält auch Unterstützung für die Registrierung und laufenden Timeouts verschiedener Arten über eine Prioritäts- (Such-) Warteschlange. Dies deutet darauf hin, dass die meisten sleep-ähnliche Anrufe auch auf der Schnittstelle piggybacking sein können.

Über Datenbankzugriff: Sicher, Sie greifen oft auf die Datenbank über einen Netzwerk-IO-Socket so Aufruf forkIO und tun DB-Zugriff in einem separaten Thread sollte machbar, schnell und sicher sein. Die Datenübertragung an den Rest der Anwendung kann mit einer der Nebenläufigkeitsmitteln Chan oder STM.TChan erfolgen.

Ich glaube nicht, dass es Arten von IO gibt, wo der Manager auf Blockierung per se zurückgreifen muss, aber ich kann mir vorstellen, dass einige Bibliotheken den neuen IO-Manager umgehen und direkt auf die Jugularis zugehen. Sie werden natürlich blockieren.

Verwandte Themen