没有 -m 多线程/并行默认行为的 gsutil

gsutil without -m multithreading / parallel default behavior

我想知道是否在没有 -m 选项的情况下调用 gsutil mv,默认值是多少。我在 config.py 源代码中看到,即使没有 -m 选项,默认情况下也会计算 CPU 内核的数量并将其与 5 个线程一起设置。所以默认情况下,如果你有一台 4 核机器,你将获得 4 个进程和 5 个线程,基本上是开箱即用的多线程。我们如何找出 -m 的作用,我想我在一些文档中看到 -m 默认为 10 个线程,但产生了多少个进程?我知道您可以覆盖这些设置,但是 -m 的默认设置是什么?

should_prohibit_multiprocessing, unused_os =ShouldProhibitMultiprocessing()
if should_prohibit_multiprocessing:
  DEFAULT_PARALLEL_PROCESS_COUNT = 1
  DEFAULT_PARALLEL_THREAD_COUNT = 24
else:
  DEFAULT_PARALLEL_PROCESS_COUNT = min(multiprocessing.cpu_count(), 32)
  DEFAULT_PARALLEL_THREAD_COUNT = 5

for 循环中的 mv 命令也会利用 -m 还是它会一次只向 gsutil 命令提供一个渲染并行过时的命令?我问的原因是因为使用下面的循环处理 50000 个文件需要 24 小时才能完成,我想知道我是否使用 -m 选项是否有帮助?不确定每次迭代调用 gsutil 命令是否允许全线程,或者它是否只使用 10 个进程和 10 个线程来使它的速度提高一倍?

#!/bin/bash

for files in $(cat listing2.txt) ; do  
    echo "Renaming: $files --> ${files#removeprefix-}"
    gsutil mv gs://testbucket/$files gs://testbucket/${files#removeprefix-}
done

感谢评论者@guillaume blaquiere, 我设计了一个 python 程序,该程序将对 API 调用进行多处理,以使用 25 个并发进程将文件移动到云中。我将在这里分享代码,希望对其他人有所帮助。

import time
import subprocess
import multiprocessing


class GsRenamer:
    def __init__(self):
        self.gs_cmd = '~/google-cloud-sdk/bin/gsutil'

def execute_jobs(self, cmd):
    try:
        print('RUNNING PARALLEL RENAME: [{0}]'.format(cmd))
        print(cmd)
        subprocess.run(cmd, check=True, shell=True)
    except subprocess.CalledProcessError as e:
        print('[{0}] FATAL: Command failed with error [{1}]').format(cmd,
                                                                     e)

def get_filenames_from_gs(self):
    self.file_list = []
    cmd = [self.gs_cmd, 'ls',
           'gs://gs-bucket/jason_testing']
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    output = p.stdout.readlines()
    for files in output:
        files = files.decode('utf-8').strip()
        tokens = files.split('/')[-1]
        self.file_list.append(tokens)
        self.file_list = list(filter(None, self.file_list))

def rename_files(self, string_original, string_replace):
    final_rename_list = []
    for files in self.file_list:
        renamed_files = files.replace(string_original,
                                      string_replace)
        rename_command = "{0} mv gs://gs-bucket/jason_testing/{1} " \
                         "gs://gs-bucket/jason_testing/{2}".format(
            self.gs_cmd, files, renamed_files)
        final_rename_list.append(rename_command)
        final_rename_list.sort()
    multiprocessing.pool = multiprocessing.Pool(
        processes=25)
    multiprocessing.pool.map(self.execute_jobs, final_rename_list)


def main():
    gsr = GsRenamer()
    gsr.get_filenames_from_gs()
    #gsr.rename_files('sample', 'jason')
    gsr.rename_files('jason', 'sample')


if __name__ == "__main__":
    main()