gpt4 book ai didi

python - 使用 boto 将多个文件并行上传到 s3

转载 作者:行者123 更新时间:2023-12-01 07:56:43 28 4
gpt4 key购买 nike

http://ls.pwd.io/2013/06/parallel-s3-uploads-using-boto-and-threads-in-python/

我尝试了链接中提到的第二个解决方案,将多个文件上传到 s3。此链接中提到的代码不会在线程上调用方法“join”,这意味着即使线程正在运行,主程序也可能会终止。使用这种方法,整个程序的执行速度要快得多,但不能保证文件是否正确上传。真的是这样吗?我更关心主程序完成得快吗?使用这种方法会产生什么副作用?

最佳答案

只是玩了一会儿,我发现多处理需要一段时间才能拆除池,但除此之外并没有太多

测试代码为:

from time import time, sleep
from multiprocessing.pool import Pool, ThreadPool
from threading import Thread


N_WORKER_JOBS = 10


def worker(x):
# print("working on", x)
sleep(0.1)


def mp_proc(fn, n):
start = time()
with Pool(N_WORKER_JOBS) as pool:
t1 = time() - start
pool.map(fn, range(n))
start = time()
t2 = time() - start
print(f'Pool creation took {t1*1000:.2f}ms, teardown {t2*1000:.2f}ms')


def mp_threads(fn, n):
start = time()
with ThreadPool(N_WORKER_JOBS) as pool:
t1 = time() - start
pool.map(fn, range(n))
start = time()
t2 = time() - start
print(f'ThreadPool creation took {t1*1000:.2f}ms, teardown {t2*1000:.2f}ms')


def threads(fn, n):
threads = []
for i in range(n):
t = Thread(target=fn, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()


for test in [mp_proc, mp_threads, threads]:
times = []
for _ in range(7):
start = time()
test(worker, 10)
times.append(time() - start)

times = ', '.join(f'{t*1000:.2f}' for t in times)
print(f'{test.__name__} took {times}ms')

我得到以下计时(Python 3.7.3、Linux 5.0.8):

  • mp_proc ~220ms
  • mp_threads ~200ms
  • 线程 ~100ms

然而,拆卸时间都在 100 毫秒左右,这使得一切都基本一致。

我已经研究过日志记录和源代码,这似乎是由于 _handle_workers仅每 100 毫秒检查一次(它执行状态检查,然后休眠 0.1 秒)。

有了这些知识,我可以将代码更改为休眠 0.095 秒,然后一切都在彼此的 10% 以内。另外,考虑到这只是在池拆卸时发生一次,很容易安排这种情况不在内部循环中发生

关于python - 使用 boto 将多个文件并行上传到 s3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55938420/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com