I use Python for a bit of scripting and not much more, and have never played with threading, so apologies for what will probably be basic questions. We run a bunch of wireless controllers (mc's) and I want to use the controller API to transfer firmware via TFTP to each controller in preparation for an upgrrade (the API call needs to be run on each controller individually). It can take 10 mins or so to copy the firmware to each controller so I thought I'd try to make this work using threads so the firmware gets copied to them all quicker. The tutorial I used suggested using concurrent.futures.ThreadPoolExecutor so that's what I am trying to do (mc_list is a list of controller IPs). with concurrent.futures.ThreadPoolExecutor(max_workers=len(mc_list)) as executor: # Work through list of controllers for mc in mc_list: # get uid for use in subsequent API call to this mc uid = aos_ArubaAPI_utils.get_uid(host = mc, user = user, pword = pwd) print(f"Attempting to call function using executor") executor.submit(aos_ArubaAPI_utils.tftp_firmware_to_controller(mc, firmware, part, uid), mc) Just to be clear the call "aos_ArubaAPI_utils.tftp_firmware_to_controller(mc, firmware, part, uid)" is to a separate function in a separate module. I did read that this should actually be a 'callable' but I'm not sure what the distinction between the two is. The code actually works, but it is not running the function on the controllers in parallel, it just loops once the previous call to the function has finished. What am I doing wrong? Thank you Guy Continue reading...