branch: externals/el-job
commit 96abd158c3254283c1f8b9099036b8ff9dc18662
Author: Martin Edström <meedstro...@gmail.com>
Commit: Martin Edström <meedstro...@gmail.com>

    Readme
---
 README.org | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/README.org b/README.org
index 886805f23e..9979bbd2df 100644
--- a/README.org
+++ b/README.org
@@ -5,13 +5,23 @@ Imagine you have a function you'd like to run on a long list 
of inputs.  You cou
 
 This library is a tool to split up the inputs and run the function in many 
subprocesses (one per CPU core), then merge their outputs and pass it back to 
the current Emacs.  In the meantime, current Emacs does not hang at all.
 
+Best of all, it completes /faster/ than =(mapcar #'FN INPUTS)=, owing to the 
use of all CPU cores!
+
 For real-world usage, search for =el-job-launch= in the source of 
[[https://github.com/meedstrom/org-node/blob/main/org-node.el][org-node.el]].
 
+** Design rationale
+
+I wanted was to shorten the round-trip as much as possible, *between the start 
of an async task and having the results*.  For example, say you have some lisp 
that collects completion candidates, and you want async because your lisp isn't 
always be fast enough to avoid bothering the user, but you'd still like it to 
return as soon as possible.
+
+A user might delay less than 100 ms between opening the minibuffer and 
beginning to type, so there's no room for overhead like spinning up 
subprocesses that load a bunch of libraries before getting to work.  
Accordingly, this library keeps its subprocesses alive forever.
+
+An aesthetic drawback is cluttering your task manager with many entries that 
say =emacs=.  Check =M-x list-processes=.  They are safe to terminate if you 
want.
+
 ** Limitations
 
 1. Will *drop support for Emacs 28/29* sometime in mid-2025 (when Debian 
trixie is released).  For a backwards-compatible library, try 
[[https://github.com/jwiegley/emacs-async][async.el]].
 
-2. For now, some limitations on FUNCALL's return value, which must always be a 
list with a fixed length, where the elements are themselves lists.  For 
example, the return value at the end of 
[[https://github.com/meedstrom/org-node/blob/main/org-node-parser.el][org-node-parser.el]]:
+2. The return value from the =:funcall= function must always be a list with a 
fixed length, where the elements are themselves lists.  For example, the return 
value at the end of 
[[https://github.com/meedstrom/org-node/blob/main/org-node-parser.el][org-node-parser.el]]:
 
    #+begin_src elisp
    (list (if missing-file (list missing-file)) ; List of 1 item or nil
@@ -22,8 +32,8 @@ For real-world usage, search for =el-job-launch= in the 
source of [[https://gith
          (if problem (list problem))))         ; List of 1 item or nil
    #+end_src
 
-   May seem clunky when you return lists of only one item, but at least it is 
easy to extend.
+   May seem clunky when you return lists of only one item, but you may 
consider it a minor expense in exhcnage for simpler library code.
 
-3. Some data types cannot be exchanged with the children: at least those whose 
printed form look like =#<...>=.
+3. Some data types cannot be exchanged with the children: those whose printed 
form look like =#<...>=.  For example, =#<buffer notes.org>=, =#<obarray 
n=94311>=, =#<marker at 3102 in README.org>=.
 
-   No problem with hash tables and other records, they have no angle brackets 
and look like =#s(hash-table data ...)=, but you cannot send markers, obarrays, 
buffers, windows etc, they look like =#<obarray n=94311>=.  (Would you ever 
want to?)
+   To my knowledge, this sort of data usually has meaning only within the 
current process, so you would never want to do that anyway.  In days past, 
*hash tables* also took that form, but not since Emacs 25 or so: their printed 
form are =#s(hash-table data ...)=, which works fine to send.

Reply via email to