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
912305043
V2EX  ›  Python

请教如何通过某个'状态'来终止 Process?

  •  
  •   912305043 · 2017-11-27 14:47:43 +08:00 · 2360 次点击
    这是一个创建于 2540 天前的主题,其中的信息可能已经有所发展或是发生改变。

    创建了某个进程(process1):

    process1 = multiprocessing.Process(target=xx,args(xx,))
    

    这个进程只会因为外界的某个'状态'改变而终止,请问如何实现?

    17 条回复    2017-11-27 21:15:10 +08:00
    kuro1
        1
    kuro1  
       2017-11-27 15:15:50 +08:00   ❤️ 1
    signal
    polythene
        2
    polythene  
       2017-11-27 15:21:20 +08:00   ❤️ 1
    Unix signal, FIFO pipe, socket
    912305043
        3
    912305043  
    OP
       2017-11-27 15:23:59 +08:00
    感谢楼上两位,正在查资料,如果方便的话希望可以给个简单的 demo 阅读下..谢谢
    oott123
        4
    oott123  
       2017-11-27 15:56:57 +08:00   ❤️ 1
    - 这个状态是在进程内部获取的还是在外部获取的?
    - 获取这个状态后,是希望外部终止进程还是进程自动退出?
    seasstyle
        5
    seasstyle  
       2017-11-27 15:58:00 +08:00 via iPhone
    test 我是黑号了?
    912305043
        6
    912305043  
    OP
       2017-11-27 16:04:07 +08:00
    @oott123
    - 这个状态是在进程内部获取的还是在外部获取的?
    :通过外部获取某个状态
    - 获取这个状态后,是希望外部终止进程还是进程自动退出?
    :关于这点,我不太清楚两者区别,对我来讲只要进程被杀掉就好了,如果方便可以解释下吗?
    billwsy
        7
    billwsy  
       2017-11-27 16:06:49 +08:00 via iPhone   ❤️ 1
    @912305043 第二个问题是,这个进程的程序是你写的吗?
    oott123
        8
    oott123  
       2017-11-27 16:08:36 +08:00   ❤️ 1
    那就简单了

    if 外部状态:
    process1.terminate()

    收工
    912305043
        9
    912305043  
    OP
       2017-11-27 16:10:07 +08:00
    @billwsy 是的,需要 **主程序** 负责控制这些进程的创建和销毁,通过在主程序中改变某个"状态"来达到某个进程被销毁的效果.
    912305043
        10
    912305043  
    OP
       2017-11-27 16:12:30 +08:00
    @oott123 是个比较简单的好办法,谢谢,用这个似乎就不用在通过信号来销毁进程了
    billwsy
        11
    billwsy  
       2017-11-27 16:16:34 +08:00 via iPhone
    @912305043 我猜 process.terminate 发了 SIGTERM
    billwsy
        12
    billwsy  
       2017-11-27 16:18:26 +08:00 via iPhone   ❤️ 1
    @912305043 啊恕我多嘴…我只是说底下还是发了 SIGTERM,不过光用并不需要了解信号…
    912305043
        13
    912305043  
    OP
       2017-11-27 16:21:44 +08:00
    @billwsy 第一次接触多线程 /多进程 编程,头很大,我明白你的意思,看了下 terminate()方法的介绍,最后还是要信号发送 SIGTERM,谢谢哈
    912305043
        14
    912305043  
    OP
       2017-11-27 16:33:22 +08:00
    @billwsy 大概是了解你第二个问题的意思了,果然还是要通过发送信号来终止,因为要在进程内获取"状态"来判断是否退出进程,外部的主程序只负责改变"状态",不关心这个进程,感谢,应该是只要如何实现了
    kimmykuang
        15
    kimmykuang  
       2017-11-27 16:40:45 +08:00
    kill -l 查下
    billwsy
        16
    billwsy  
       2017-11-27 16:52:41 +08:00 via iPhone   ❤️ 1
    @912305043 SIGTERM 默认的行为是结束程序,所以如果你只是想暴力的结束进程的话并不需要另外做什么,不然的话你可以在收到 SIGTERM 或者其他信号例如 SIGINT 的时候保存 /清理数据
    nosugar
        17
    nosugar  
       2017-11-27 21:15:10 +08:00
    python3 多进程:处理指定个数任务,完成一个 count 一次,检测完成==总任务,后自动退出。

    有需求可以看看: https://github.com/barrer/scan-helper/blob/master/scan_helper_png.py
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2783 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:34 · PVG 19:34 · LAX 03:34 · JFK 06:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.