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

标签 python redis

当我阅读 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/

相关文章:

ruby-on-rails - Sidekiq WebUI 在一段时间后停止显示工作人员

python - 如何将列表中的值输入到字符串中?

python - json.dumps() 适用于 python 2.7 但不适用于 python 3

python - 如何根据url请求更改django listview中的模板名称?

ruby - 如何为 Redis-As-Rails-Cache(使用 Redis 作为 rails 缓存)Rails 4.1 实现连接池?

spring-boot - LettuceConnectionFactory对redis和springboot是否有版本限制?

Redis Cluster with Lettuce 在节点重新启动后不会更新 IP 列表

node.js - 使用 redis 和 node.js 存储快速分析

python - Matplotlib:在 PolarAxes 上绘制一系列径向线

python - 在 matplotlib 中使用ight_layout() 和不完整的轴数组 :