run ?priority ?thread ?name f
runs f ()
in a separate thread outside Async and returns the result as a Deferred in the Async world. If f ()
raises an exception (asynchronously, since it is another thread) then that exception will be raised to the monitor that called run
.
WARNING: Async code MUST NOT be used from within f
. By Async code we mean pretty-much all functions of libraries making use of Async. Only a few functions of the Async library can be called inside In_thread.run
. These are explicitly marked as such, using the phrase "thread-safe".
If thread
is not supplied, then any thread from the thread pool could be used. If you need to run routines in a specific thread (as is required by some libraries like Sqlite), you should create a helper thread and supply it to run
.
If priority
is supplied, the priority of the thread in the linux scheduler will be set to priority
for the duration of f ()
, provided the thread is allowed to do so (see man setpriority
).
If you call run
several times with the same helper thread, the f ()
calls will run in sequence, in the order in which they are supplied to run
. Each f ()
will complete (return or raise) before another f ()
starts.
For example, if you do:
let () =
run ~thread f1;
run ~thread f2;
run ~thread f3;
Then the thread will run f1 ()
to completion, then f2 ()
to completion, then f3 ()
to completion.
If name
is supplied, the name of the thread will be set to it for the duration of the execution of f ()
.
when_finished
describes how the helper thread behaves once f ()
has completed. Its default value is the value of When_finished.default
when run
is called.