场景:

主进程中初始化了一个对象(C++模块的对象,占用内存比较大,因为加载了一个很大的词表),然后启动子进程,并在子进程中使用这个对象,子进程对这个对象只读,不写

这个对象需要周期性的更新,因为要在对象中重新加载一些数据

如何不重启服务来更新这个对象呢?

首先:

子进程因为不会对这个对象写,所以它们使用的其实跟主进程是同一个对象,它不会复制一份,只有在子进程要写这个对象的时候才会复制一个对象,这是Copy-On-Write

策略一:

在主进程中初始化好这个对象后,通过Python的多进程共享变量的方式来让子进程和主进程共享这个对象在主进程中开一个线程,启动一个timer来定时更新这个对象,当然这里要用双buffer,先初始化一个新的对象,然后切换过去,主进程和它的线程是共享内存的这样子进程中就可以无缝使用到新的对象了,而且不会影响正常的服务

首先我们知道Python的多进程间可以通过这几种方式来共享数据:

a、共享数值型:multiprocessing.Valueb、共享数组型:multiprocessing.Arrayc、共享dict类型,multiprocessing.Manager().dict()d、共享list类型,multiprocessing.Manager().list()

注意哈:

比如multiprocessing.Manager().dict()类型,不同的进程可以直接使用dict['key']来获取对应的value,那么当一个进程中修改了它,另外一个进程中获取到的就直接是最新的了,这里不需要感知变化。

其中Value是共享数值型,另外三种是集合,那是否可以通过这几个集合的方式,在集合中传入自定义的对象来共享呢?

结论:简单的自定义对象可以(因为可以序列化和反序列化),复杂的对象不可以

比如这样一个简单的对象就可以在多进程间通过multiprocessing.Manager().dict()共享:

class TestObj:def __init__(self, age):self.age = age

但是更复杂一点的就不行了,比如上面说的这个从C++的so文件中加载的一个对象就无法通过multiprocessing.Manager().dict()共享, 会报如下错误:

File "/search/odin/software/anaconda2/lib/python2.7/multiprocessing/managers.py", line 758, in _callmethodconn.send((self._id, methodname, args, kwds))RuntimeError: Pickling of "baike_matcher.BaikeMatcher" instances is not enabled (http://www.boost.org/libs/python/doc/v2/pickle.html)

可以看到是在conn.send的时候报错,说我自定义的这个对象不支持。

其实这个错误涉及到Pickling关键词,这个其实是序列化相关的,问题其实就是pikcle无法对BaikeMatcher对象序列化, 可以尝试直接用pickle来序列化:

import pickleprint pickle.dumps(BaikeMatcher(10), 1)

发现报错和上面一样

问题:

这个C++的对象没有办法序列化,即使在C++代码中给这个对象定义了序列化和反序列化的方法,pickle应该也无法调用它,所以原则上来说,它是无法序列化的。

既然无法序列化,那么通过共享的方式来共享这个对象的方法看样子也是行不通了。

后面也尝试了使用multiprocessing.managers.BaseManager对象来尝试共享变量,但是其实遇到的问题和上面是一样的,BaikeMatcher对象无法序列化。

策略二:

直接在每个子进程中分别起一个线程,由每个子进程的线程自己来更新这个对象,这样就不会涉及到不同的进程间共享变量的事情了

问题:

这个对象占用内存太大,如果每个子进程自己加载,就会导致每个进程维护一个不同的对象了,而每个对象都会占用一部分内存,导致内存严重浪费。这跟在主进程中更新这个对象大有不同,在主进程中更新只会占用一份内存

策略三:

将这个对象提供的功能部署成一个服务,并部署到本地docker容器

因为我们的服务最终都会部署到kubernetes上去,而kubernetes中用到了docker容器,并且提供了通过localhost来调用本地依赖容器中服务的功能,最终主服务部署的容器和依赖服务部署的容器将会一起打包发布到一台宿主机上,这样主服务就可以通过localhost的方式来调用其他容器中的服务了,依赖服务中我们采用thrift来部署服务的。

具体策略:

.  修改该C++服务的代码,让它自己单独起一个线程去定时加载需要的数据并更新相关变量,C++的多线程可以真正的实现并发,而这些线程是共享内存的,所以不涉及Python的多进程共享变量的问题。.  将该对象提供的服务部署到一个单独的docker容器中,并通过thrift提供服务

不重启服务如何定时更新进程中的一个对象相关推荐

  1. saltstack学习-9:批量安装nginx服务并定时更新配置(pillar)

    环境介绍: slatmaster:10.80.0.162 minion01:10.80.0.163 minion02:10.80.0.164 目标:在两台minion上安装nginx服务,并定时同步m ...

  2. 苹果升级后怎么恢复以前的版本_iPhone升级iOS14,卡在更新进程无法启动怎么办?...

    你的iPhone升级了吗?你的iPhone有遇到升级到一半卡在更新进程无法启动吗? iOS14正式版已发布,很多小伙伴在升级系统过程中却遇上了"大"问题,卡在更新进程中,进度条停止 ...

  3. 利用PHP安装windows自动运行的服务,PHP程序可以实现长时间、自动运行、定时更新功能,直接可以用在项目中的类源代码...

    为什么80%的码农都做不了架构师?>>>    什么 windows服务 ? Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运 ...

  4. Python3高并发定时更新任务进程池和线程池的使用

    Python3高并发定时更新任务进程池和线程池的使用 背景:需要定时对数据库的某一张表做更新 不管用多线程还是多进程只能利用当前一台机器的计算能力,可以考虑使用celery这样的工具,后期可以横向扩展 ...

  5. 如何不重启服务,把编译类放入正在运行的服务中去

    1显示指定要替换的类列表:jar tvf paycenter-bank.jar |grep CmbcDebitFastPayImpl 2解压这个类:jar xvf paycenter-bank.jar ...

  6. Nacos数据库配置更新需要重启服务

    排查问题 线上环境报错,看报错信息可定位到是SQL语句有误. 但这段SQL在测试环境是没有问题的. 对比后发现是数据库配置 spring:dataSource:url: 的数据库链接后面要加 & ...

  7. Android系统在新进程中启动自定义服务过程(startService)的原理分析 (下)

    Step 10. ActivityManagerService.attachApplicationLocked 这个函数定义在frameworks/base/services/java/com/and ...

  8. C#中调用Windows系统服务exe程序的工具类与重启服务的流程

    场景 使用C#编写的Windows服务程序,在Winform中进行调用. 常用工具类方法检测服务是否存在或者安装,获取服务状态,启动服务,停止服务的方法. 以在Winform中重启服务为例. 注: 博 ...

  9. linux 重启命令_如何在 Ubuntu 和其他 Linux 发行版中启动、停止和重启服务 | Linux 中国...

    服务是必不可少的后台进程,它通常随系统启动,并在关机时关闭.-- Sergiu 服务是必不可少的后台进程,它通常随系统启动,并在关机时关闭.如果你是系统管理员,那么你会定期处理服务.如果你是普通桌面用 ...

最新文章

  1. 基于队列的生产消费设计java_生产者-消费者设计模式
  2. eclipse工程中查看android源码
  3. 使用MYCAT作为Mysql HA的中间件(转)
  4. hdu 4288 Coder
  5. 鲍捷 | 知识表示——面向实战的介绍
  6. Https java信任_java访问非经过信任证书https的方法
  7. Kernel Method核方法—基本概念
  8. 大数据分析的误区有哪些
  9. 6个常见校园网认证客户端故障原因及解决方法
  10. ERP系统多少钱一套?不同情况详情分析告诉你!
  11. 这四本第四届橙瓜网络文学奖体育竞技分类前五的作品不能不看!
  12. 2019第一季度工作总结
  13. 关于JAVA WEb如何连接Matlab
  14. HTML学习笔记(二)--基础
  15. css 字体图标更改颜色_在CSS中更改字体
  16. STL容器基础 - 0
  17. Python小姿势 - Python爬取网页数据
  18. 用python编程 商品打折怎么计算_(特价书)从问题到程序:用Python学编程和计算
  19. ELLE风尚大典暨全球75周年庆典在成都环球中心举办
  20. gis插入的文本怎么搞成两行_怎么样制作标书?Word排版技巧大全,让标书制作更简单...

热门文章

  1. 51nod 省选联测 R2
  2. 运行mvc项目报错 %@ Application Codebehind=Global.asax.cs Inherits=NHAPPAPI.MvcApplication Language=C...
  3. 函数式编程(4)-装饰器
  4. javascript-抽象工厂模式
  5. jQuery源码分析系列:.domManip() .buildFragment() .clean()
  6. 【Java】javaWeb中的三大组件与八大监听器
  7. Lambda表达式示例代码
  8. 接口测试工具-Apipost变量的定义和使用
  9. SpringBoot是什么?SpringBoot的优缺点有哪些?
  10. python里的pip有什么用_python的pip有什么用