微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

跨线程共享 Django 事务

如何解决跨线程共享 Django 事务

我遇到了一个问题,即在使用 gunicorn (gevent) 运行的 django (3.2) 网络应用程序中实现的一个 API 必须从多个 API 获取不同的价格并将这些价格存储在数据库 (Postgres 13) 中,然后再返回给客户端. 我想把插入放在同一个事务中,所以如果发生意外,什么都不会插入。

我现在首先调用所有 API,每个 API 都在一个绿色线程 (gevent) 中,在它们全部返回后,我批量插入结果。

但结果我真的很好奇我是否可以让不同的线程(绿色或非绿色)共享同一个事务。我看到 psycopg2 可以以非阻塞方式执行。 现在的问题是每次我在 Django 中启动线程时,新线程都在一个新事务中。我将深入研究 django db 后端源以了解发生了什么,但也许有人可以解决这个问题。

Tldr;不同的线程可以在同一个事务中执行查询吗?

解决方法

您绝对不想尝试在没有锁定机制的情况下在多个线程之间共享单个事务/postgres 连接,以确保它们不会以某种导致错误的讨厌方式交错连接上的活动。

相反,一个更简单、更安全的解决方案是从主请求线程启动您的绿色线程,然后从同一个主请求线程 gevent.join([<green thread1>,<green thread2>...]) 所有这些线程。每个绿色线程都会从 API 中获取数据,并在每个线程的退出时将其返回。

然后让主请求线程遍历每个退出的绿色线程对象(greenlet)并通过Greenlet.get()获取每个对象的返回值。然后使用其正常的事务/连接在主请求线程上执行插入操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。