如何在python中获取资源时等待而不阻塞线程?

问题描述 投票:0回答:1

假设我们需要创建一个数据库连接池,要求是当一个客户端尝试获取连接时,如果所有现有连接都忙,则需要等待30秒才放弃,希望其他客户端释放一些连接.所以天真的解决方案是

def get_connection():
    if all_conn_are_busy:
        time.sleep(30)
        try to get connection again
    else:
        return conn

但是由于 time.sleep(30) 会阻塞线程,如果有 2 个客户端同时尝试连接,它会阻塞 60 秒。那么有没有办法既不阻塞又要等一段时间呢?

python block
1个回答
0
投票

(A.) 如果你处于这种“等待”状态,你就已经输掉了战斗。

(B.) 听起来你想要一个单独的线程 致力于获取 next 连接。 如果它 already 忙于尝试获得一个, 那么第二个调用者应该立即遭受致命错误。

有几十个线程都在吵着要下一个连接 来自终端超载的数据库服务器听起来像是灾难的根源。

考虑以较慢的速度预分配连接, 所以总有一个可供下一个请求者使用。

显然你有一些连接池和一个策略 用于丢弃空闲连接。重新评估适合程度 该政策是根据您当前的用例。

© www.soinside.com 2019 - 2024. All rights reserved.