Module Rpc_parallel.Expert

If you want more direct control over your executable, you can use the Expert module instead of start_app. If you use Expert, you are responsible for starting the master and worker rpc servers. worker_command_args will be the arguments sent to each spawned worker. Running your executable with these args must follow a code path that calls worker_init_before_async_exn and then start_worker_server_exn. An easy way to do this is to use worker_command.

val start_master_server_exn : ?⁠rpc_max_message_size:int ‑> ?⁠rpc_handshake_timeout:Core.Time.Span.t ‑> ?⁠rpc_heartbeat_config:Async.Rpc.Connection.Heartbeat_config.t ‑> worker_command_args:string list ‑> unit ‑> unit

start_master_server_exn must be called in the single master process. It is necessary to be able to spawn workers. Raises if the process was spawned.

You have two options for implementing the worker process, a simple one and a deprecated one.

Simple option: just make sure worker_command is somewhere in the command hierarchy of the same executable in which start_master_server_exn is called, with a subcommand path equal to worker_command_args. It is possible for multiple calls to start_master_server_exn to share the same worker_command_args.

Deprecated option: implement something at least as complicated yourself using worker_init_before_async_exn and start_worker_server_exn. This option may go away in the future.

val worker_command : Async.Command.t
module Worker_env : sig ... end
val worker_init_before_async_exn : unit ‑> Worker_env.t

worker_init_before_async_exn must be called in a spawned worker process before the async scheduler has started. You must not read from stdin before this function call.

This has the side effect of calling chdir.

val start_worker_server_exn : Worker_env.t ‑> unit

start_worker_server_exn must be called in each spawned process. It is illegal to call both start_master_server_exn and start_worker_server_exn in the same process. Raises if the process was not spawned.

This has the side effect of scheduling a job that completes the daemonization of this process (if the process should daemonize). This includes redirecting stdout and stderr according to redirect_stdout and redirect_stderr. All writes to stdout before this job runs are blackholed. All writes to stderr before this job runs are redirected to the spawning process's stderr.