redispy的connectionPool中的checkpid方法的作用是什么?

2024-06-02 12:52:53 发布

您现在位置:Python中文网/ 问答频道 /正文

当我阅读redispy(https://github.com/andymccurdy/redis-py/blob/master/redis/connection.py)的代码时,我了解了它是如何实现连接池的, 但是我遇到了一个问题,我无法理解-u 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。任何帮助都是适当的。在


Tags: the代码pyhttpsselfgithubcomredis
1条回答
网友
1楼 · 发布于 2024-06-02 12:52:53

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

因此,如果您创建一个连接池,然后发出请求,然后进行fork,您将遇到一个问题:当池本身在新进程之间被复制时,池中的套接字不会被复制,而是跨进程共享。在

这可能导致这样一种情况:一个进程向redis客户机写入数据,而另一个等待应答的进程将得到错误的回复。在

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

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

相关问题 更多 >