假设我们需要创建一个数据库连接池,要求是当一个客户端尝试获取连接时,如果所有现有连接都忙,则需要等待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 秒。那么有没有办法既不阻塞又要等一段时间呢?
(A.) 如果你处于这种“等待”状态,你就已经输掉了战斗。
(B.) 听起来你想要一个单独的线程 致力于获取 next 连接。 如果它 already 忙于尝试获得一个, 那么第二个调用者应该立即遭受致命错误。
有几十个线程都在吵着要下一个连接 来自终端超载的数据库服务器听起来像是灾难的根源。
考虑以较慢的速度预分配连接, 所以总有一个可供下一个请求者使用。
显然你有一些连接池和一个策略 用于丢弃空闲连接。重新评估适合程度 该政策是根据您当前的用例。