kazoo在多进程下使用全局连接死锁问题

kazoo在多进程下使用全局连接死锁问题


问题描述

在使用kazoo作为分布式系统的协调部件时,在多进程共用一个连接到zookeeper服务器的全局连接时,程序往往会阻塞在使用全局连接操作zookeeper目录时,但使用多线程却不会

import multiprocessing

from kazoo.client import KazooClient

zk = KazooClient(hosts="localhost:2181")
zk.start()

def getChildren():
    print 'start'
    print zk.get_children('/')

if __name__ == '__main__':
    process = multiprocessing.Process(target=getChildren)
    process.start()

上述程序在启动进程后,先是输出'start',然后就阻塞在zk.get_children('/')

import threading

from kazoo.client import KazooClient

zk = KazooClient(hosts="localhost:2181")
zk.start()

def getChildren():
    print 'start'
    print zk.get_children('/')

if __name__ == '__main__':
    thread = threading.Thread(target=getChildren)
    thread.start()

如果换成线程启动,则会正常输出相应结果后结束

原因猜测

具体原因未有定论,但是曾经看到过说

在类unix系统下,在线程中fork生成子进程会造成死锁

也许是造成该问题的原因

这只是我的猜测而已,希望了解的童鞋给予指导!拜谢!

你可能感兴趣的:(kazoo在多进程下使用全局连接死锁问题)