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生成子进程会造成死锁
也许是造成该问题的原因
这只是我的猜测而已,希望了解的童鞋给予指导!拜谢!