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