2017-02-03 6 views
0

, когда я прочитал код Redis-ру (https://github.com/andymccurdy/redis-py/blob/master/redis/connection.py), я узнал, как это реализовать пул соединений, Но проблема догоняет меня, я не могу понять метод _checkpid()Что такое функция _checkpid в соединенииPool redis-py?

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. любая помощь согласуется.

ответ

1

Когда вилка процесса Unix, она делит все сокеты, уже открытые в ней своими дочерними элементами.

Итак, если вы создаете пул соединений, а затем создаете запрос, а затем вилку, у вас возникнет проблема: если пулы сами копируются между новыми процессами, сокеты в пуле не копируются и совместно используются процессы.

Это может привести к ситуации, когда один процесс записывает клиенту redis, а другой, ожидающий ответа, получит неправильный ответ.

Однако вновь созданные сокеты ПОСЛЕ развилки не будут использоваться родителями и дочерними элементами.

Итак, проверяя pid, пул проверяет, была ли развита вилка, и если да, сбрасывает все свои сокеты и создает новые. Это предотвращает появление очень плохих вещей :)

+0

Огромное спасибо за вашу помощь! Но я не могу придумать ситуацию, когда вилки будут происходить, почему мы должны развиваться, и, на мой взгляд, метод проверки может только предотвратить то, что вы сказали, не могли бы вы привести мне пример? – GuangshengZuo

+0

@ user3013527 python не может использовать более одного процессора из-за GIL. Forking позволяет программам python использовать многоядерные машины. дополнительную информацию см. в модуле Multiprocessing в python. https://docs.python.org/3/library/multiprocessing.html –

+0

СПАСИБО очень много за вашу помощь! – GuangshengZuo