it编程 > 编程语言 > Java

python kazoo 踩坑记录

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

(0)

您想发表意见!!点此发布评论

推荐阅读

深入探索:Zookeeper+消息队列(kafka)集群

07-28

ZooKeeper注册中心:分布式系统的协调大师与服务注册利器(一)

07-28

【Kafka】Windows下安装Kafka(图文记录详细步骤)

07-28

【运维】Kafka高可用: KRaft(不依赖zookeeper)集群搭建

07-28

Kafka是什么,以及如何使用SpringBoot对接Kafka

07-28

Linux虚拟机安装---Zookeeper(Dubbo环境下)

07-28

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论