当前位置: 首页 > 工具软件 > Kazoo v3 > 使用案例 >

python kazoo 踩坑记录

东郭思远
2023-12-01

问题场景:python 启动rpc服务挂载到zookeeper上供javai调用

问题现象:zookeeper的节点总是掉,但是服务没有挂,监听进行重连也会再次挂掉

问题原因:zookeeper服务端会定时对客户端进行心跳检测,在rpc在执行中 无法回应zookeeper服务端

解决方案1:zookeeper使用一个单独的线程进行连接保持,

        在并发量小时没有问题

        并发量大的情况下,单cpu跑到100 ,zookeeper的线程因为GIL锁的原因无法进行心跳检测一

        样会掉节点

解决方案2:zookeeper使用一个单独的进程进行连接保持,

 注意:在windows上要注意进程启动的位置,Windows的进程启动方式是Spawn,Linux的缺省的启动方式是Fork。简单的说,Fork会复制父进程的所用东西,而Spawn不会。对于Python而言,Spawn会在进程中生成一个新的Python解释器,并重新加载各个module

#hello.py
from multiprocessing import Process, Queue

def f(q):
    q.put('hello world')

def run_mp():
    q = Queue()
    p = Process(target=f, args=[q])
    p.start()
    print (q.get())
    p.join()

run_mp()

像上面这段代码,在Linux上运行hello.py,只会输出一个“hello world”。因为主进程会运行 run_mp, 子进程负责把“hello world”放进Queue里。
而在Windows下,进程的启动方式是spawn,子进程需要先import hello.py这个module,在import的过程中,run_mp()就在子进程中运行,然后子进程又会产生新的进程(p=Process(target=f,args=[q]))当然Windows不会让这种死循环产生,所以发现这种情况就会抛出开头的异常。
所以在Windows的环境下 if name == “main” 必须被加上保证新的进程不会在import module的时候产生。

多进程相关原文链接:https://blog.csdn.net/qq_43051923/article/details/118250484

 类似资料: