Solution is: Add a management layer above the copy queue:
The layer gets all file copy requests
The layer has waiting list of files to be copied. If more files are requested, they are merged into the waiting list.
The layer manages the files copy so that at any given time only 'max_copy_streams' are open.
The layer has a thread which moves files from waiting list to start copy if streams are availalbe