Python 版本:2.7
现在需要利用 tornado 实现这个样子的一个功能:
1.利用 tornado 创建多个进程。
2.进程内写有 从数据库读取配置信息 的方法,读取出来的配置信息将会存储在进程中的一个 A 变量中。
3.进程内写有 根据配置信息做出对应的操作 的方法,其中配置信息是从 A 变量中取出的。
4.因为连接数据库比较耗时,所以将配置信息存在变量中,以供下次更快得获取配置信息。数据库中的配置信息会被修改(但频次不确定,有可能半天一次,有可能一天一次,所以不准备用定时任务同步配置信息),当其他服务修改完配置信息后会调用 从数据库读取配置信息 的接口方法。
目前遇到的问题:
假设有 10 个进程在跑,在其他服务修改完配置信息后,其发送的请求只有一次,只会被一个进程竞争到从而调用 从数据库读取配置信息 的方法,但是剩下的 9 个是不会调用该方法的。由于是利用多进程进行处理,所以每个进程的 A 变量是不同的,因此会造成一个进程的 A 变量存放的是半小时前的配置信息,但是另一个进程的 A 变量存放的是刚刚更新的配置信息。 有什么办法可以让每个进程的 A 变量都同步起来呢?
尝试过的解决方案:
1.采用管道( Pipe )通信,在一个进程接收到 从数据库读取配置信息 的调用请求时,通过管道向其他进程发送消息,使他们都调用一次 从数据库读取配置信息 的方法。但是管道通信貌似是阻塞的,而且发出来的一次消息,被消费后就不存在的,也就是说只有一个进程可以收到这条通知。无效~
2.事件方式,灵感来自于 ioloop.add_handler()。但是 google 了一下,貌似只有 ioloop 有这个方法,不知道可不可以对进程添加一个监听事件。
尝试了 2 天,没有好的解决方案,因此来这里求指点~ 谢谢大家啦~~~
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.