开发中遇到一个需求,要批量把几十万张图片上传到腾讯云。
这是一个很典型的多线程场景,上传属于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()
核心要注意三个点:
- 使用
locker = threading.BoundedSemaphore(10)
,设置了线程总数为10 - 每次启动一个新的线程进行上传,
threading.Thread(target=upload_zip, args=(folder_name, zip, locker))
- 在上传函数upload_zip里,上传成功后,释放掉锁。
locker.release()
。