原理说明

在Remind-You中,每个plugin都对应着一个进程。主进程在启动后,从配置文件中读取当前有多少个插件。并依次启动这些插件。后续plugin进程退出后,主进程都会重新生成plugin进程。

代码位置

可以在github上找到第一天的代码。https://github.com/bymzy/remind-you/tree/day1

文件结构

[root@bymzy remind-you]# tree
.
├── __init__.py
├── main.py
├── plugins
│   ├── conf.json
│   ├── dict_plugin.py
│   ├── dict_plugin.pyc
│   ├── __init__.py
│   └── __init__.pyc
├── scheduler.py
├── scheduler.pyc
└── setup.py

在第一天的工作中,比较重要的文件有,main.py, scheduler.py, dict_plugin.py以及conf.json。启动conf.json需要被拷贝到/etc/scheduler.py。

依赖的环境及库

使用python2.7运行。

  • mulitprocessing
    该库提供了方法,可以一某个函数为目标,生成一个进程执行。返回的进程对象,的start方法用来启动该进程;is_alive方法用来判断进程是否已经退出。

    process = multiprocessing.Process(target=func, args=(arg))
    process.start()
    process.is_alive()
  • importlib
    在Remind-You中,需要支持动态的添加插件。使用importlib可以根据字符串导入lib。

    module = importlib('dict_plugin.py')

主要代码

CONF_FILE = '/etc/scheduler.conf'def parse_config(conf):with open(conf, 'r') as f:data = f.read()return json.loads(data)def run_plugin(plugin):name = plugin.get('name')fileName = plugin.get('fileName')desc = plugin.get('desc')arg = plugin.get('args')module = importlib.import_module('plugins.' + fileName)process = multiprocessing.Process(target=module.run, args=(arg,))process.start()return processdef scheduler_loop():print 'main process pid: %u' % os.getpid()conf_dict = parse_config(CONF_FILE)process_list = []for plugin in conf_dict.get('plugins', []):process_list.append((plugin, run_plugin(plugin)))# monitor process while True:to_add = []to_del = []for proc in process_list:if not proc[1].is_alive():proc[1].join()to_add.append((proc[0], run_plugin(proc[0])))to_del.append(proc)for proc in to_del:process_list.remove(proc)to_del = []for proc in to_add:process_list.append(proc)to_add = []time.sleep(2)

dict_plugin.py 代码示例

import time
import os
import requestsdef run(args):print 'my pid is: %u ' % os.getpid()time.sleep(3)

plugin代码比较简单,只有一个run函数打印自己的pid,然后等待3s退出。这样做事为了模拟,主进程将plugin进程拉起的情况。

配置文件示例

{"plugins": [{   "name": "dict","desc": "help you remember English words","fileName": "dict_plugin","args": "test"}   ]
}

代码说明

  • 在main.py中,执行scheduler_loop()方法。这个方法首先从配置文件中读取所有的插件。当前只有一个dict插件,插件fileName字段描述有该插件代码所在的文件,插件代码中默认的run函数为插件的运行函数。
  • 使用importlib将插件import进主进程,然后使用multiprocessing.Process生成一个新的进程并调用Start启动。
  • 主进程当前页比较简单,循环的判断插件进程是否退出。如果退出,则继续生成一个插件进程。

最终执行效果如下

执行main.py后,插件进程定时退出,然后重新被拉起。

remind-you-day1.PNG

Remind-You Part1. 多进程控制相关推荐

  1. python多进程控制gui界面_Python优雅地终止了多进程和gui进程

    我使用glade作为我的gui并创建一个进程来运行我的gui.单击此应用程序将打开套接字.当我按下'send'时,它将把textfield中的任何内容发送到套接字.套接字接收这些数据并将其发回.问题是 ...

  2. Expect 教程中文版

    原文链接 本教程由*葫芦娃*翻译,并做了适当的修改,可以自由的用于非商业目的. [BUG] 有不少部分,翻译的时候不能作到"信,达".当然了,任何时候都没有做到"雅&qu ...

  3. 当代研究生应当掌握的5种Pytorch并行训练方法(单机多卡)

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨纵横@知乎 来源丨https://zhuanlan.zhihu ...

  4. 实践教程|PyTorch训练加速技巧

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨用什么名字没那么重要@知乎(已授权) 来源丨https://z ...

  5. 收藏 | PyTorch 单机多卡操作总结

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨科技猛兽@知乎 来源丨https://zhuanlan ...

  6. shell-脚本入门【转】

    阅读目录 2.3.4 参数扩展--正则表达式 转自:http://blog.csdn.net/gexiaobaohelloworld/article/details/7973846 版权声明:本文为博 ...

  7. shell-脚本入门

    http://www.blogjava.net/liubowu/archive/2007/06/25/99317.html 1 Shell环境设置 1.1 登陆欢迎信息 终端机接口 (tty1 ~ t ...

  8. Linux shell 交互式编程、TCL/TK 和 Expect 编译与安装、expect 编程

    以下文章资源都来源于网络,保留原作者的一切权利: Expect 被用来进行一些需要进行交互是shell 编程的,比如完成ssh 自动登录,就可以使用 expect 编程来实现 1,获取原始的tcl源码 ...

  9. 工作流模式的学习与总结

    工作流模式的学习与总结 概念:    2 工作流的具体应用    2 工作流的审批模式    3 工作流的分类    3 Basic Control Flow Patterns    3 1.顺序(S ...

最新文章

  1. 关于我的Android 博客
  2. 实用的IDE工具助力你学好Python
  3. SAP BRF+ Interpretation模式与Generation模式的区别
  4. 360公布权威机构对扣扣保镖的测试报告
  5. vue-router 路由跳转
  6. Maven - 依赖冲突
  7. 网页百度地图api,支持位置偏移
  8. 数据库主从数据一致性的几种解决方案
  9. Baxter实战 (四)ubuntu14.04安装kinect V2
  10. OV7725摄像头模块SCCB通信
  11. 用计算机怎么安装新思路软件,新思路计算机二级
  12. PS-第七天-图层混合模式及图层蒙版
  13. 歌曲:酒干倘卖无 背后的故事
  14. Ubuntu17.04系统安装必备软件与存在的问题
  15. 基于学术研究下载NOAA气象雷达资料的详细步骤
  16. 音频(二) 基音周期与共振峰
  17. android蓝牙浅析
  18. python excel处理重复行并统计个数_python统计一个文本中重复行数的方法
  19. 电话机漏电流大引起电话交换机振铃
  20. 软件复用及构件、C/S与B/S混合模型及实战项目技术简述

热门文章

  1. AutoLisp的扩展函数记录
  2. Bug[5] 多路连接客户服务器,发送一路数据时,其他几路自动断开,查询PDP显示未被激活
  3. ASP.NET Identity 三(转载)
  4. Android中 onTouchEvent() 与 onInterceptTouchEvent()事件的区别详解
  5. 计算机网络 自定向下方法1.1-1.2
  6. 存储过程基本语法结构
  7. 量子力学的群星闪耀时
  8. 宝塔控制面板安装禅道开源版教程
  9. 史上最科学的AI算命研究,3万张自拍揭露长相与性格关系:颜值即命
  10. Java使用apache.http.client.fluent快速构建HTTP请求