2013-10-31 6 views
5

Wird empfohlen, die Funktionalität von core.async um eigene asynchrone Funktionen zu erweitern?Erweitern der Funktionalität von clojure core.async

Die Asynchronität der Kanäle wird von put! und take! behandelt, die Rückrufe akzeptieren, aber die Protokolle sind in den Namespace async.impl.protocols geschachtelt. Tut impl bedeuten draußen bleiben! in diesem Fall, oder ist es in Ordnung, sie zu implementieren?

Zum Beispiel könnte ich einen Netty-Kanal oder einen Java-Socket als ReadPort und WritePort wickeln.

+0

Nun, hier * verwendet *, um eine Antwort hier zu sein, die im Wesentlichen sagte "mach es!" Es scheint, als wäre das zurückgezogen worden. –

+0

Ich würde sagen, mach was du willst! – Hendekagon

+0

@Hendekagon, aber wenn das Protokoll versteckt ist, dann ist die Wahrscheinlichkeit größer, dass es sich ohne vorherige Ankündigung ändert. Das wäre ein Bär. –

Antwort

7

Die Protokolle core.async sollen als Implementierungs-Hooks für die Implementierung eigener Puffer, Kanäle, Ports usw. dienen. Sie existieren unter impl, da sie Teil der Implementierung sind, nicht die API für öffentliche Benutzer.

Das Team betrachtet sie als offen für Änderungen, bis eine Nicht-Alpha-Version der Bibliothek veröffentlicht wird (ich habe keinen Zeitrahmen dafür). Von der async-Version bis jetzt haben sich die Protokolle nicht geändert, jedoch gibt es in diesem Moment eine bahnbrechende Prozessänderung speziell zu put! und take!.

Wenn Sie bereit sind, sich mit Änderungen abzumühen, können Sie dies nach Belieben implementieren.

Tim B hat viel Zeit damit verbracht, asynchrone Kanäle mit dem Netzwerk zu verbinden, und es ist sehr schwierig, die Semantik des Kanals beizubehalten. Das empfohlene Muster hierfür ist die Verwendung dedizierter Threads, die mit Netzwerk-E/A kommunizieren und "am Rand" mit den Kanälen in der Anwendung kommunizieren (wahrscheinlich unter Verwendung von put! und take!). Dieses Muster erfordert keine Implementierung der internen Protokolle.