我想创建一个带有调用boto3 api的函数的池,并为每个线程使用不同的桶名:
我的职责是:
def face_reko(source_data, target_data):
bucket = s3.Bucket(bucket_name)
for key in bucket.objects.all():
key.delete()
s3_client.put_object(Bucket=bucket_name, Key=target_img, Body=target_data)
s3_client.put_object(Bucket=bucket_name, Key=source_img, Body=source_data)
response = reko.compare_faces(
SourceImage={
'S3Object': {
'Bucket': bucket_name,
'Name' : source_img
}
},
TargetImage={
'S3Object' : {
'Bucket' : bucket_name,
'Name' : target_img
}
}
)
if len(response['FaceMatches']) > 0:
return True
else:
return False
所以基本上它会删除桶中的所有内容,上传2个新图像然后使用Rekognition api来比较2个图像。由于我不能在同一个桶中创建两次相同的图像,我想为每个线程创建一个桶,然后将一个常量传递给桶名称的函数,而不是bucket_name
const。
答案 0 :(得分:0)
所以最后我找到了解决问题的方法。我没有将我的函数maping到池中,而是创建了一个Worker
类,定义如下:
class Worker():
def __init__(self, proc_number, splited_list):
self.pool = Pool(proc_number)
self.proc_number = proc_number
self.splited_list = splited_list
def callback(self, result):
if result:
self.pool.terminate()
def do_job(self):
for i in range(self.proc_number):
self.pool.apply_async(face_reko, args=(self.splited_list[i],source_data, i), callback=self.callback)
self.pool.close()
self.pool.join()
所以Worker
obj构造有许多进程和列表列表(splitted_list
是我在number_of_proc
中分割的主列表)。然后,当调用do_job
函数时,池首先创建可以在i
函数中使用的标识为face_reko
的进程。 face_reko
返回True
时,游泳池停止。要启动Worker.pool
,只需创建一个Worker
并像这样调用do_job
函数:
w = Worker(proc_number=proc_number, splited_list=splited_list)
w.do_job()
希望它能帮助别人!