Google app engine 任务队列并发期间变量值不一致

Google app engine 任务队列并发期间变量值不一致,google-app-engine,task-queue,amazon-ses,Google App Engine,Task Queue,Amazon Ses,我使用拉队列和推队列来管理我呼叫Amazon SES发送电子邮件的速率。我注意到,在10个收件人的示例列表中,有些收件人会收到重复的电子邮件,而其他人则会收到0封。电子邮件总数仍达10封 这是我目前的设置 上传收件人的csv。每行包含收件人电子邮件地址以及他们收到的电子邮件活动模板。Web处理程序读取csv并将每一行作为任务添加到拉入队列中。 工作线程从pull中租用10个任务,并将每个任务添加到push队列中。 推送队列工作程序获取包含收件人电子邮件地址和电子邮件模板活动名称的参数。活动名称决

我使用拉队列和推队列来管理我呼叫Amazon SES发送电子邮件的速率。我注意到,在10个收件人的示例列表中,有些收件人会收到重复的电子邮件,而其他人则会收到0封。电子邮件总数仍达10封

这是我目前的设置

上传收件人的csv。每行包含收件人电子邮件地址以及他们收到的电子邮件活动模板。Web处理程序读取csv并将每一行作为任务添加到拉入队列中。 工作线程从pull中租用10个任务,并将每个任务添加到push队列中。 推送队列工作程序获取包含收件人电子邮件地址和电子邮件模板活动名称的参数。活动名称决定电子邮件的主题行。该数据映射到ses.py中的活动字典中。它通过查找与活动名称对应的键来查找活动的主题行。主题行以及收件人地址和活动被放入数据字典中,数据字典被传递到通过SES发送电子邮件的助手函数中。推送队列配置的速率为10/s,存储桶大小为10,最大并发请求为10,任务重试限制为0。这是为了限制它,使它在我的SES发送速度限制10封电子邮件/秒之内。 这是发送电子邮件工作人员的代码。在将数据变量传递到send_announce_email函数之前,我会记录它是什么

import ses

class SendEmailWorker(webapp2.RequestHandler):
  def post(self):
    payload = json.loads(self.request.get('data'))
    # The value of payload is {'email': 'bob@gmail.com', 'campaign': 'version_a'}
    CAMPAIGNS = ses.CAMPAIGNS
    data = CAMPAIGNS[payload['campaign']]
    data['campaign'] = payload['campaign']
    data['email'] = payload['email']

    logging.info('Data before ses function: %s' % data)
    ses.send_announce_email(data)
这是ses.py中ses.send\u announce\u电子邮件的代码。我要做的第一件事就是记录数据是什么

CAMPAIGNS = {'version_a': {'subject': 'Email subject line 1'},
             'version_b': {'subject': 'Email subject line 2'},
             'version_c': {'subject': 'Email subject line 3'}}


def send_announce_email(data):
  logging.info('Data during ses function: %s' % data)

  text_template = render_template('emails/announce_2.txt', data=data)
  html_template = render_template('emails/announce_2.html', data=data)

  send_email(
    sender='Hello <hello@example.com>',
    subject=data['subject'],
    body=html_template,
    to_addresses=data['email'],
    format='html',
    reply_addresses='hello@example.com',
    text_body=text_template)
让我感到奇怪的是,在将数据传递到send函数之前以及在send函数的开头,我会记录哪些数据是正确的。他们通常是平等的,但大约20%的时候,他们是不同的

当我将max_concurrent_requests设置为1时,我没有看到这种情况发生。变量值是否会因并发而混淆


此外,send_announce_email功能中记录的电子邮件地址与Amazon SES实际发送的电子邮件地址不匹配。某些收件人可能会收到重复的电子邮件。我正在使用boto ses库。

听起来像是非线程安全代码的问题。ses的定义是什么。这似乎是第一个调查的地方。另一个文件名为ses.py。它导入boto.ses库,并在这些库函数周围具有一些包装函数,以与AmazonSes交互。我如何判断它是否是线程安全的,以及可以做些什么呢?如果使用模块级名称来存储值,这些值将不是线程安全的。我建议您阅读有关处理螺纹安全的指南,并阅读Nick Johnson的文章。这些结合在一起会给你一些关于寻找什么的想法。