41人参与 • 2024-07-28 • Java
问题场景: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
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论