嵌套循环和参数的Python多处理示例

嵌套循环和参数的Python多处理示例,python,python-2.7,boto3,Python,Python 2.7,Boto3,我是Python编程新手,我有一个关于循环中的多处理的问题,它必须保持位置。在我的示例中,我遍历多个AWS IAM帐户,并创建一个excel工作簿,其中包含多个工作表,每个帐户对应一个工作表。在每个帐户工作表的上下文中,我只需要返回一组与当前帐户相关的权限 但是,每个bucket需要的处理时间非常长,因为每个bucket中可能有400k以上的文件。但是这些呼叫本身对主机系统来说并不是很费力。因此,我希望一次检查4-6个桶,但仍然让它们正确地写在各自的表格上 我找不到类似的例子。你们中的一个好小伙

我是Python编程新手,我有一个关于循环中的多处理的问题,它必须保持位置。在我的示例中,我遍历多个AWS IAM帐户,并创建一个excel工作簿,其中包含多个工作表,每个帐户对应一个工作表。在每个帐户工作表的上下文中,我只需要返回一组与当前帐户相关的权限

但是,每个bucket需要的处理时间非常长,因为每个bucket中可能有400k以上的文件。但是这些呼叫本身对主机系统来说并不是很费力。因此,我希望一次检查4-6个桶,但仍然让它们正确地写在各自的表格上

我找不到类似的例子。你们中的一个好小伙子能给我指出正确的方向吗。下面是我的伪代码。我正在用Python2.7TIA做这个

accounts = get_aws_iam_accounts()

for account in accounts:
    Add_worksheet_to_workboook(account)

    buckets = get_s3_bucket_list()

    for bucket in buckets:
        acl = get_s3_bucket_acl(BucketName=bucket)
            permission = acl.get('Grantee').get('URI')

            if permission != None
                write_permission_to_worksheet(permission)
使用:

在本例中,
executor.submit
将使用
permission
参数计划
将权限写入工作表
执行

executor.submit
不会等到提交的任务完成并在任务计划完成后立即返回

要确保所有任务都已完成,您必须调用
executor.shutdown(wait=True)
,但此调用保证由nice
以ThreadPoolExecutor(max\u workers=4)作为执行者执行:
语句执行

所以线程池管理将一个新任务附加到工作线程,将线程切换到一个新任务,并在需要时关闭所有工作线程


关于你的评论:你最好使用线程,而不是进程。内存不在进程之间共享,操作系统阻止一个进程访问另一个进程内存空间。对流程来说,访问公共资源(我假设您的工作表是这样)可能是一个非常棘手的问题。另一方面,由一个进程启动的所有线程共享相同的内存

我还要强调一点,我不确定线程或多处理是否更好。我也愿意听取关于这方面的建议。谢谢。谢尔盖,谢谢你的详尽答复。但是,最棘手的部分是:acl=get\u s3\u bucket\u acl(BucketName=bucket),执行者如何处理必须返回的内容?@mumbles你可以提交3个操作(
get\u s3\u bucket\u acl
,获得它的许可,将其写入工作表)作为单个任务,不是吗?@mumbles实际上
executor.submit(…)
返回
future
对象。它有
result()
方法,但显然blocks@mumbles我使答案符合条件
accounts = get_aws_iam_accounts()

with ThreadPoolExecutor(max_workers=4) as executor: # configure number of threads

    for account in accounts:
        Add_worksheet_to_workboook(account)

        buckets = get_s3_bucket_list()

        for bucket in buckets:
            executor.submit(write_perm_to_worksheet, bucket)


def write_perm_to_worksheet(bucket):
    acl = get_s3_bucket_acl(BucketName=bucket)
    permission = acl.get('Grantee').get('URI')
    if permission != None
        write_permission_to_worksheet(permission)