每个线程

时间:2017-11-08 14:52:40

标签: python multithreading amazon-s3 boto3 amazon-rekognition

我想创建一个带有调用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。

1 个答案:

答案 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()

希望它能帮助别人!