当我阅读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。任何帮助都是适当的。在
当一个Unix进程分叉时,它与它的子进程共享它已经打开的所有套接字。在
因此,如果您创建一个连接池,然后发出请求,然后进行fork,您将遇到一个问题:当池本身在新进程之间被复制时,池中的套接字不会被复制,而是跨进程共享。在
这可能导致这样一种情况:一个进程向redis客户机写入数据,而另一个等待应答的进程将得到错误的回复。在
但是,在fork之后新创建的套接字将不会在父对象和子对象之间共享。在
因此,通过检查pid,池检查是否生成了fork,如果是,则重置其所有套接字并创建新的套接字。这样可以防止非常糟糕的事情发生:)
相关问题 更多 >
编程相关推荐