The BackgroundManager class is something I have vaguely dreamed about for  
decades. It handles all details of running separate processes in the 
background *without blocking Leo*.

Previous efforts were feeble.  They merely provided a thin (useless!) 
wrapper around subprocess.Popen. 

The BackgroundManager is much more capable.  It manages a queue of 
background processes, and runs them *one after another* in the background.  
It registers a handler with the IdleTimeManager that checks to see if the 
presently running background process has completed.  If so, it writes its 
output to the log and starts another background process in the queue.

Because only one background process from the queue is ever running, the 
background processes can to write their output to Leo's log without the 
output becoming intermixed.

You can kill all processes by calling BM.kill().  That's what the 
'kill-pylint' command does.  You can add processes to the queue at any 
time.  For example, you can rerun the 'pylint' command while a background 
process is running.

The BackgroundManager is completely safe: all of its code runs in the main 
process.

*Improvements*

Ah, the joys of documentation.  As I write this, I realize that it would be 
better to use a singleton BackgroundManager, say g.app.backgroundManager.  
This would allow multiple *kinds* of background processes to coexist 
peacefully without intermixed output.

The following relatively minor changes are needed:

1. BM.start_process already can handle process corresponding to different 
commands passed to subprocess.Popen.  However, the queue must be upgraded 
so it knows the type of each queued process. That is, a 'kind' argument 
should be added to BM.start_process.

2. Add a corresponding 'kind' argument to BM.kill.  This would kill the 
queued processes of the given type, or all queued processes if the 'kind' 
is None or 'all'.

Another possible improvement: optionally run shlex on the command argument 
passed to BM.start_process.  

At present, the 'pylint' command creates a string the hard, hard way.  That 
probably won't change, but it *might* be possible to simplify command 
creation using shlex.  The jury is still out on this one.

*Summary*

For the first time, there is an *easy* way of running processes safely in 
the background.

Relatively easy changes will allow background processes of different kinds 
to be run sequentially.

This removes another source of Emacs envy ;-)

Edward

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/leo-editor.
For more options, visit https://groups.google.com/d/optout.

Reply via email to