gpt4 book ai didi

python - redis-py的connectionPool中_checkpid方法的功能是什么?

转载 作者:可可西里 更新时间:2023-11-01 11:13:06 25 4
gpt4 key购买 nike

当我阅读 redis-py ( https://github.com/andymccurdy/redis-py/blob/master/redis/connection.py ) 的代码时,我了解了它是如何实现连接池的,但是我遇到了一个问题,我无法理解 _checkpid() 方法

def _checkpid(self):
if self.pid != os.getpid():
with self._check_lock:
if self.pid == os.getpid():
# another thread already did the work while we waited
# on the lock.
return
self.disconnect()
self.reset()

请原谅我无法复制连接池的所有代码。这是我的想法,当它从池中获得连接或释放到池中时,它都会检查 pid,我不明白为什么。如果它在多进程中运行,则不需要锁它将有许多相同的池。如果它在多线程中运行,它将始终获得相同的 pid。任何帮助都是合适的。

最佳答案

当一个 Unix 进程 fork 时,它与它的子进程共享所有已经打开的套接字。

所以如果你创建一个连接池,然后发出请求,然后 fork,你会遇到一个问题:虽然池本身在新进程之间被复制,但池中的套接字不会被复制并且在进程之间共享.

这可能会导致这样一种情况,即一个进程写入 Redis 客户端,而另一个等待回复的进程将得到错误的回复。

但是,在 fork 之后新创建的套接字将不会在父子之间共享。

因此,通过检查 pid,池会检查是否已创建 fork ,如果已创建,则重置其所有套接字并创建新的套接字。这可以防止非常糟糕的事情发生:)

关于python - redis-py的connectionPool中_checkpid方法的功能是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42018102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com