Asynchronous copies

I have managed to get copies working well between Windows and Linux
but I noticed that the libraries allow Asynchronous operation. I can
send Async commands and the loop till they complete but copies seem to
stay busy forever. Maybe I am just not cleaning up right (it does not
seem so)

ssh_session = Net::SSH.start(...etc...)

# ssh_session.exec("sleep 10")
ssh_session.sftp.connect.upload(src_file, tgt_file)

ssh_session.loop(1) {
   puts "I=#{interrupted} B="+@ssh_session.busy?.inspect
   not interrupted and @ssh_session.busy?

If the sleep is called (instead of the upload) it waits 10 secs and
then is not busy and wakes.
But the copy will not wake. Since I have hundreds of files to copy
I'd like to set them all off, do some other work, and then wait for
them to complete (rather than wait for them one at a time with
upload!) and then do the other work.

Any help would be appreciated... should I cleanup the "sftp.connect"?
How? When (if it is asynchronous)?


Found the solution

ssh_session = Net::SSH.start(...etc...)

sftp_conn = ssh_session.sftp.connect! # needed to block connect here
(!) or the upload seems to hang
sftp_conn.upload(src_file, tgt_file)

interrupted = false
trap('INT') { interrupted = true }
sftp_conn.loop() {
    not interrupted and sftp_conn.pending_requests.any? # check for
pending requests
ssh_session.loop(1) {
   not interrupted and ssh_session.busy?
sftp_conn = ssh_session.sftp.connect!

One word of warning if sending lots of files (>300) fast then you may
run out of open file handles (Windows).
I avoid the error by doing this call each now and then when starting
another upload

if (sftp_conn.pending_requests.length>=100)
  interrupted = false
  trap('INT') { interrupted = true }
  sftp_conn.loop() {
    not interrupted and sftp_conn.pending_requests.any?

I guess I could have exited when the queue was smaller not empty also.

Hope this helps someone else.