Python GAE/P存储SES连接和螺纹安全

Python GAE/P存储SES连接和螺纹安全,python,google-app-engine,amazon-web-services,thread-safety,Python,Google App Engine,Amazon Web Services,Thread Safety,我正在使用亚马逊的SES从我的Python谷歌应用程序引擎发送电子邮件。我想保存SES连接,而不是为我发送的每封电子邮件创建它 对于多线程应用程序,这是一种合理的方法吗 SES = None def send_email_AWS(sender, to_addresses, subject, body): global SES if not SES: SES = SESConnection(aws_key, aws_secret) [other code

我正在使用亚马逊的SES从我的Python谷歌应用程序引擎发送电子邮件。我想保存SES连接,而不是为我发送的每封电子邮件创建它

对于多线程应用程序,这是一种合理的方法吗

SES = None

def send_email_AWS(sender, to_addresses, subject, body):
    global SES
    if not SES:
        SES = SESConnection(aws_key, aws_secret)
    [other code for sending the email]

我对什么是线程安全和什么不是线程安全没有很好的理解。

这里有一个示例可以帮助您:


或者使用webapp2应用程序注册表:

以下是一个帮助您的示例:


或者使用webapp2应用程序注册表:

从您的示例中,如果您只是像读取常量一样读取它,则没有任何问题。 您的公共变量SES不是线程安全的。这意味着,例如,如果有许多用户向该全局文件写入,那么您将始终读取发生的最后一次写入,而不是每个实例

想象线程是人。不,假设您的全局变量是公共WC。线程安全是有一个门(锁)。如果我们没有锁,每个人都会在另一把锁在里面的时候做他的工作

例如,我看到:

SES = NONE 
这意味着应用程序的每个实例都将重置SES全局变量。这不是一件好事

global SES
    if not SES:
然后,第一个请求将再次将其设置为某个值。但这并不安全,因为同时其他请求可能会覆盖它。如果这不是一个问题,那么它是确定的。 如果这是为了线程安全,那么您需要根据请求处理程序在本地创建它


@voscausa的答案向您展示了一个很好的实现示例。从你的例子中检查一下,如果你只是把它当作一个常数来阅读,那么你没有任何问题。 您的公共变量SES不是线程安全的。这意味着,例如,如果有许多用户向该全局文件写入,那么您将始终读取发生的最后一次写入,而不是每个实例

想象线程是人。不,假设您的全局变量是公共WC。线程安全是有一个门(锁)。如果我们没有锁,每个人都会在另一把锁在里面的时候做他的工作

例如,我看到:

SES = NONE 
这意味着应用程序的每个实例都将重置SES全局变量。这不是一件好事

global SES
    if not SES:
然后,第一个请求将再次将其设置为某个值。但这并不安全,因为同时其他请求可能会覆盖它。如果这不是一个问题,那么它是确定的。 如果这是为了线程安全,那么您需要根据请求处理程序在本地创建它


@voscausa的答案向您展示了一个很好的实现示例。看看这个答案为什么没有用。它展示了如何在Python中保存全局线程安全。您只需更改对象中的模型类。我已经更新了答案。谢谢你,希望我能分享奖金,因为两个答案都是相似的。为什么这个答案没有用。它展示了如何在Python中保存全局线程安全。您只需更改对象中的模型类。我已经更新了答案。谢谢你,希望我能平分赏金,因为两个答案是相似的。