Már*_*ôso 5 python django postgresql multithreading gevent
我遇到一个问题,在使用 Gunicorn (gevent) 运行的 django (3.2) Web 应用程序中实现的一个 API 必须从多个 API 获取不同的价格,并将这些价格存储在数据库 (Postgres 13) 中,然后再返回客户端。我想将插入放在同一个事务中,因此如果发生意外情况,则不会插入任何内容。
我现在首先调用所有 api,每个 api 都在一个绿色线程(gevent)内,然后在所有 api 返回后,我批量插入结果。
但事实证明,我真的很好奇不同的线程(绿色或非绿色)是否可以共享相同的事务。我看到 psycopg2 可以以非阻塞方式执行。现在的问题是每次我在 django 中启动线程时,新线程都位于新事务中。我将深入研究 django db 后端源代码以了解发生了什么,但也许有人可以解决这个问题。
太棒了;不同的线程可以在同一事务内执行查询吗?
您绝对不想在没有某种锁定机制的情况下尝试在多个线程之间共享单个事务/postgres 连接,以确保它们不会以某种导致错误的令人讨厌的方式交错连接上的活动。
相反,一个更简单、更安全的解决方案是从主请求线程启动绿色线程,然后gevent.join([<green thread1>, <green thread2>...])从同一个主请求线程启动所有绿色线程。每个绿色线程都会从 API 获取数据,并将其作为每个线程的退出返回。
然后让主请求线程遍历每个退出的绿色线程对象(greenlet)并获取每个 via 的返回值Greenlet.get()。然后使用其正常事务/连接在主请求线程上执行插入。
更新
如果您想变得更复杂以实现更好的性能,您可以使用池并让每个 greenlet 将其结果放在从主线程读取的队列中。这样,您就可以在结果可用时开始将结果保存到数据库,而不是等到它们全部完成。
| 归档时间: |
|
| 查看次数: |
792 次 |
| 最近记录: |