Last active
August 23, 2022 15:04
-
-
Save deviousasti/d4c5d31eb12da4a81bfc099baeb564b3 to your computer and use it in GitHub Desktop.
Fast inter-process RPC using shared memory
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
open SharedMemory | |
open MBrace.FsPickler | |
module Rpc = | |
type RpcContext<'command, 'message> = | |
{ name: string; buffer: RpcBuffer; post: 'command -> Async<'message>} with | |
interface IDisposable with | |
member this.Dispose() = this.buffer.Dispose() | |
let createHost name (handler : 'command -> Async<'message>) = | |
let pickler = FsPickler.CreateBinarySerializer() | |
let onReceive data = Async.StartAsTask <| async { | |
let command = pickler.UnPickle data | |
let! message = handler command | |
return pickler.Pickle message | |
} | |
{ name = name; buffer = new RpcBuffer(name, (fun _ data -> onReceive data)); post = handler } | |
let createClient name = | |
let pickler = FsPickler.CreateBinarySerializer() | |
let buffer = new RpcBuffer(name) | |
let onSend command = async { | |
let data = pickler.Pickle command | |
let! response = buffer.RemoteRequestAsync data |> Async.AwaitTask | |
if not response.Success then | |
failwith "Failed to get response" | |
return pickler.UnPickle response.Data | |
} | |
{ name = name; buffer = new RpcBuffer(name); post = onSend } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage