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

时间:2017-06-18 14:18:37

标签: python python-2.7 boto3

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

但是,通过每个存储桶所需的处理时间非常长,因为每个存储桶中可以存在超过400k的文件。但这些电话本身并不会对主机系统造成太大的负担。因此,我希望一次可以使用4-6个桶,但仍然可以正确地写出各自的纸张。

我一直无法找到做类似事情的例子。你们其中一个人可以指出我正确的方向。我的伪代码如下。我在Python 2.7 TIA中做到了这一点!

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)

1 个答案:

答案 0 :(得分:1)

使用thread pool

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)

在此示例中,executor.submit将使用write_permission_to_worksheet参数安排permission执行。

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

要确保所有任务都已完成,您必须调用executor.shutdown(wait=True)但是此保证会通过良好的with ThreadPoolExecutor(max_workers=4) as executor:语句进行此调用

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

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