我有一个问题,即在使用 gunicorn (gevent) 运行的 django (3.2) 网络应用程序中实现的一个 API 必须从多个 API 获取不同的价格并将这些价格存储在数据库 (Postgres 13) 中,然后再返回给客户端。
我想将插入放在同一个事务中,因此如果发生意外,则不会插入任何内容。
我现在首先调用所有apis,每个apis都在一个绿色线程(gevent)中,在它们都返回之后,我批量插入结果。
但结果我真的很好奇我是否可以让不同的线程(绿色与否)共享同一个事务。我看到 psycopg2 可以以非阻塞方式执行。
现在的问题是每次我在 Django 中启动线程时,新线程都在一个新事务中。我将深入研究 django db 后端源以了解发生了什么,但也许有人可以解决这个问题。
网址;不同的线程可以在同一个事务中执行查询吗?
最佳答案
您绝对不想尝试在没有锁定机制的情况下在多个线程之间共享单个事务/postgres 连接,以确保它们不会以导致错误的某种讨厌的方式交错连接上的事件。
相反,一个更简单、更安全的解决方案是从主请求线程启动你的绿色线程,然后 gevent.join([<green thread1>, <green thread2>...])
所有这些都来自同一个主请求线程。每个绿色线程都会从 API 中获取数据,并在每个线程的退出时将其返回。
然后让主请求线程遍历每个退出的绿色线程对象(greenlet)并通过 Greenlet.get()
获取每个对象的返回值.然后使用其正常的事务/连接在主请求线程上进行插入。
关于python - 跨线程共享 Django 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68186732/