V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
mythmgn
V2EX  ›  Python

[库推荐] 自荐 Python 开源的基础库 CUP 给大家

  •  
  •   mythmgn · 2018-09-12 14:58:02 +08:00 · 2874 次点击
    这是一个创建于 2298 天前的主题,其中的信息可能已经有所发展或是发生改变。

    介绍

    • CUP 基础库是百度开源的 Python 语言基础库,致力将 DEV 从涉及底层操作、Util 操作类解放出来,使其更关注构建 service 上层业务逻辑。
    • 目前已涵盖了构建一个服务的各个方面,大家可以从基础库的代码结构、wiki、doc 中进行简单了解。
    cup
        |-- cache.py                module              缓存相关模块 ( Memory cache related module )
        |-- decorators.py           module              python 修饰符,比如 @Singleton 单例模式 (Decorators of python)
        |-- err.py                  module              异常 exception 类, Exception classes for CUP
        |-- __init__.py             module              默认__init__.py, Default __init__.py
        |-- log.py                  module              打印日志类,CUP 的打印日志比较简洁、规范,设置统一、简单(cup logging module)
        |-- mail.py                 module              发送邮件 ( CUP Email module (send emails))
        |-- net                     package             网络相关操作( Network operations, such as net handler parameter tuning )
        |-- oper.py                 module              一些混杂操作(Mixin operations)
        |-- platforms.py            module              跨平台、平台相关操作函数(Cross-platform operations)
        |-- res                     package             资源获取、实时用量统计等,所有在 /prco 可获得的系统资源、进程、设备等信息 ( Resource usage queries (in /proc)、Prcoess query、etc )
        |-- shell                   package             命令 Shell 操作 pakcage ( Shell Operations、cross-hosts execution )
        |-- services                package             构建服务支持的类(比如心跳、线程池 based 执行器等等) Heartbeat、Threadpool based executors、file service、etc
        |-- thirdp                  package             第三方依赖纯 Py 模块( Third-party modules:pexpect、httplib2 )
        |-- timeplus.py             module              时间相关的模块(Time related module)
        |-- unittest.py             module              单元测试支持模块( Unittest、assert、noseClass )
        |-- util                    package             线程池、可打断线程、语义丰富的配置文件支持( ThreadPool、Interruptable-Thread、Rich configuration、etc )
        |-- version.py              module              内部版本文件,CUP Version
    

    如果你觉得 CUP 很棒,请帮我们 star,并推荐给厂内、厂外的 亲朋砖友。 更欢迎为 CUP 撰写 patch、新 feature,一起添砖加瓦!

    感谢, ---Gallon

    5 条回复    2019-05-29 10:38:17 +08:00
    rel
        1
    rel  
       2018-09-13 10:57:49 +08:00
    注释写的真好,点赞
    nbboy
        2
    nbboy  
       2018-09-27 09:47:37 +08:00
    很棒
    ClutchBear
        3
    ClutchBear  
       2019-01-10 16:58:14 +08:00
    不支持 python3...
    mythmgn
        4
    mythmgn  
    OP
       2019-05-29 10:36:24 +08:00
    最近在基于 CUP 写踩坑之旅, 欢迎大家查看: 附一个昨凌晨写的


    # Python 踩坑之旅进程篇其三 pgid 是个什么鬼

    ## 1.1 踩坑案例

    pid, ppid 是大家比较常见的术语, 代表进程号,父进程号. 但 pgid 是个什么鬼?

    了解 pgid 之前, 我们先复习下:

    - [进程篇其一]( https://mp.weixin.qq.com/s?__biz=MzUxMjIzODQ3Mg==&mid=2247483675&idx=1&sn=4338aef5e4268d01d9197cdbb515b301&chksm=f96637fcce11beea8bbbb617359152311e968b0023f844d90164943235db412286572dc5973e&token=863711821&lang=zh_CN#rd)
    - 里面场景是: 一个进程通过`os.system`或者`Popen`家族启动子进程
    - 后通过杀死父进程的方式无法杀死它的连带子进程
    - 我们通过其他方式进行了解决

    这个场景还有个后续就是:

    - 如果这个子进程还有孙子怎么办?
    - 它还有孙子的孙子怎么办?

    这个就是今天我们遇到的坑, 怎么处理孙子进程. 大家注意, 不仅是 Python 会遇到这个问题, 其他语言包括 Shell 都一样会遇到这种"孙子"进程怎么进程异常处理的问题.

    ## 1.2 填坑解法

    本期的坑位解法其实有两种, 第一种比较暴力, 简称穷尽搜索孙子法.

    a. 穷尽搜索孙子法, 代码示例

    关键点:

    - 使用 cup.res.linux 中的 Process 类, 获得该进程所有的子孙进程
    - 使用 kill 方法全部杀死

    ```python
    from cup.res import linux
    pstatus = linux.Process(pid)
    for child in pstatus.children(recursive=True):
    os.kill(child, signal.SIGKILL)
    ```

    b. 获得该进程的 PGID, 进行 kill 操作

    b1. 先讲个 shell 操作的做法, 使用 ps 获取进程的**pgid**, 注意**不是**pid

    ```bash
    # 以 mysqld 为例, 注意 pgid 项
    ps -e -o uid,pid,gid,pgid,cmd|grep mysql
    ```

    结果:

    - 注意其中第三列, 该进程和子进程都使用了同样的 pgid **9779**

    9790 0 9779 /bin/sh /usr/bin/mysqld_safe --datadir=/home/maguannan/mysql/mysql/....

    10171 501 9779 /home/maguannan/bin/mysqld --basedir=/home/maguannan/mysql/....

    - 通过`kill -9 -9779`的方式可以杀死该 pgid 底下的所有**子孙**进程

    b2. 在讲 Python 里的处理方式

    ```python
    import os
    import signal
    from cup.res import linux
    pstatus = linux.Process(pid)
    os.killpg(pstatus.getpgid(), signal.SIGKILL)
    ```
    mythmgn
        5
    mythmgn  
    OP
       2019-05-29 10:38:17 +08:00
    奇怪 似乎回复不支持 markdown?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2743 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:28 · PVG 20:28 · LAX 04:28 · JFK 07:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.