多线程批量上传文件的python实现

2,550 阅读1分钟

开发中遇到一个需求,要批量把几十万张图片上传到腾讯云。

这是一个很典型的多线程场景,上传属于IO密集型的操作。

另外,关于如何控制线程的个数,我使用了threading库里的BoundedSemaphore,这能设置线程个数,如果都被占用了,则进行阻塞。

实际编码如下:

def upload_zip(folder, zip, locker):
    # 省略掉跟业务紧密的上传逻辑
    locker.release()

if __name__ == "__main__":
    base_dir_list = ['a', 'b', 'c']
        locker = threading.BoundedSemaphore(10)
        for base_dir in base_dir_list:
            folders = os.listdir(base_dir)
            for folder_name in folders:
                folder_path = os.path.join(base_dir, folder_name)
                zips = os.listdir(folder_path)
                for zip in zips:
                    locker.acquire()
                    t = threading.Thread(target=upload_zip, args=(folder_name, zip, locker))
                    t.start()

核心要注意三个点:

  1. 使用locker = threading.BoundedSemaphore(10),设置了线程总数为10
  2. 每次启动一个新的线程进行上传,threading.Thread(target=upload_zip, args=(folder_name, zip, locker))
  3. 在上传函数upload_zip里,上传成功后,释放掉锁。locker.release()