Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python学习笔记10.4 通过killpg杀死进程组

python学习笔记10.4 通过killpg杀死进程组

作者头像
锦小年
发布于 2021-12-08 03:52:57
发布于 2021-12-08 03:52:57
90000
代码可运行
举报
文章被收录于专栏:锦小年的博客锦小年的博客
运行总次数:0
代码可运行

在实际使用多进程的过程中,希望一个子进程报错,则停止所有进程,并退出主进程。在子进程中不能使用exit()函数,它会使得主进程一直等待,程序就卡在这里了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from  multiprocessing import Pool
import time
import os
import sys
import signal
import subprocess
import platform
def f(i):
    print(f'running {i}, pid: {os.getgid()}')
    if i == 3:
        time.sleep(5)
        print('exit in subp')
        exit()
    time.sleep(3)
    return i

def call_back(i):
    print('callback:',i)

def error_call_back(i):
    print('error:',i)
    
def main():
    mp = Pool(4)
    for i in range(10):
        mp.apply_async(f,args=(i,),callback=call_back,error_callback=error_call_back)
    mp.close()
    mp.join()
if __name__ == '__main__':
    main()

程序运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
running 0, pid: 1000
running 1, pid: 1000
running 2, pid: 1000
running 3, pid: 1000
callback: 0
running 4, pid: 1000
callback: 1
running 5, pid: 1000
callback: 2
running 6, pid: 1000
exit in subp
None
running 7, pid: 1000
callback: 4
running 8, pid: 1000
callback: 5
running 9, pid: 1000
callback: 6
callback: 7
callback: 8
callback: 9

程序并不会退出。

解决方案:使用在error_callback中使用killpg函数,杀死进程组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from  multiprocessing import Pool
import time
import os
import sys
import signal
import subprocess
import platform
def f(i):
    print(f'running {i}, pid: {os.getgid()}')
    
    if i == 3:
        time.sleep(5)
        print('subprocess raise error, jump to error callback')
        raise ValueError(f'error in {i}')
    time.sleep(3)
    return i

def call_back(i):
    print('callback:',i)

def error_call_back(i):
    print('error:',i)
    print('exit by killpg')
    kill_sig = signal.SIGKILL
    os_name = platform.system()
    if os_name == 'Windows':
        kill_sig = signal.CTRL_C_EVENT
    os.killpg(os.getpgid(os.getpid()), kill_sig)
    
def main():
    mp = Pool(4)
    for i in range(10):
        mp.apply_async(f,args=(i,),callback=call_back,error_callback=error_call_back)
    mp.close()
    mp.join()
if __name__ == '__main__':
    main()

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
running 0, pid: 1000
running 1, pid: 1000
running 2, pid: 1000
running 3, pid: 1000
callback: 0
running 4, pid: 1000
callback: 1
running 5, pid: 1000
callback: 2
running 6, pid: 1000
subprocess raise error, jump to error callback
running 7, pid: 1000
error: error in 3
exit by killpg

这样就能解决两个问题: (1)子进程发生异常时所有子进程退出且主进程退出。 (2)子进程中不能使用exit()函数问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python3 与 C# 并发编程之~ 进程篇下
看看 connection.Pipe方法的定义部分,是不是双向通信就看你是否设置 duplex=True
逸鹏
2018/08/14
1.6K0
Python3 与 C# 并发编程之~ 进程篇下
Python3 与 C# 并发编程之~ 进程实战篇
之前说过 Queue:在 Process之间使用没问题,用到 Pool,就使用 Manager().xxx, Value和 Array,就不太一样了:
逸鹏
2018/09/07
9770
Python3 与 C# 并发编程之~ 进程实战篇
subprocess.popen.kill杀死所有子进程
subprocess.Popen(['google-chrome',"http://www.baidu.com"])可打开chrome并显示百度网页。
py3study
2020/02/25
5.6K0
Python 标准类库-并发执行之multiprocessing-基于进程的并行
multiprocessing是一个支持使用类似于线程模块的API派生进程的包。该包同时提供本地和远程并发,通过使用子进程而不是线程,有效地避开了全局解释器锁。因此,multiprocessing模块允许程序员充分利用给定机器上的多个处理器。它同时在Unix和Windows上运行。
授客
2023/07/10
8870
Python3 与 C# 并发编程之~ 进程篇上
上次说了很多Linux下进程相关知识,这边不再复述,下面来说说Python的并发编程,如有错误欢迎提出~
逸鹏
2018/08/14
6250
Python3 与 C# 并发编程之~ 进程篇上
python multiprocess 子进程和主进程同时抛出异常时子进程无法退出
在使用python的multiprocess库时,如果在主进程中的处理子进程的返回函数callback或者处理子进程的错误的函数errorbackerror中抛出异常,则子进程无法退出。 (1)errorcallback中抛出异常
锦小年
2021/12/08
3.4K0
python multiprocess 子进程和主进程同时抛出异常时子进程无法退出
Python学习笔记(七)——进程和线程
很多时候,子进程并不是自身,而是一个外部进程。我们创建了子进程后,还需要控制子进程的输入和输出。
蛮三刀酱
2019/09/10
4050
Python守护进程daemon实现
守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。 在这里,我们在Linux2.6内核的centos中,ps -ef |awk '{print $1"\t "$2"\t "$3"\t  "$8}'看到:PPID=0的进程有两个,分别是PID=1的/sbin/init进程和PID=2的[kthreadd]进程。
py3study
2020/01/07
7.9K0
Python多进程之进程池
由于Python中线程封锁机制,导致Python中的多线程并不是正真意义上的多线程。当我们有并行处理需求的时候,可以采用多进程迂回地解决。
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.1K0
小说python中的孤儿进程
然而,在实际应用中,孤儿进程虽然不会给系统造成直接性的危害,但更多时候会对业务造成一些影响,如当子进程为一个基于tcp的socket服务时,会造成主进程再次启动时无法启动,端口被占用。主进程退出了,子进程会因为无法获得某些资源,而变成业务上的"僵尸进程",这实际也是资源浪费。对于一些有进程监控的服务来说,可能会造成业务主服务无法重启,或是进程不可控。
用户2196567
2018/09/20
1.8K0
小说python中的孤儿进程
Python实现Daemon(守护)进程
我编写了两种,第一种是编写了一个程序,将其用setsid命令让其放入后台运行,第二种是直接fork()一个进程,在代码里将进程设置为后台启动。
py3study
2020/01/07
1.5K0
进程和线程(上)
最近会开始继续 Python 的进阶系列文章,这是该系列的第一篇文章,介绍进程和线程的知识,刚好上一篇文章就介绍了采用 concurrent.futures 模块实现多进程和多线程的操作,本文则介绍下进程和线程的概念,多进程和多线程各自的实现方法和优缺点,以及分别在哪些情况采用多进程,或者是多线程。
Python进阶者
2019/10/23
6690
Python学习笔记(十)·进程和线程
很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。
公爵
2022/09/28
5560
Python学习笔记(十)·进程和线程
python标准库之MultiProcessing库的研究 (1)
MultiProcessing模块是一个优秀的类似多线程MultiThreading模块处理并发的包 之前接触过一点这个库,但是并没有深入研究,这次闲着无聊就研究了一下,算是解惑吧。 今天先研究下apply_async与map方法。传闻就是这两个方法分配进程池中的进程给相关函数,我想验证下。 看下官网对这两个的解释: apply_async(func[, args[, kwds[, callback[, error_callback]]]]) A variant of the apply() method which returns a result object.
Ryan_OVO
2023/10/18
2280
python标准库之MultiProcessing库的研究 (1)
python 协程池和pool.map用法
上面直接将所有任务加到列表中,然后一次性,全部异步执行。那么同一时刻,最多有多少任务执行呢?
py3study
2020/02/25
3.6K0
python多线程
1 多进程 # 多进程, import os import time from multiprocessing import Process # 启动时必须在 if __name__ 判断下,windows 必须,其他 无限制 # ================================================= # def func(args): # print("子进程:",os.getpid()) # print("子进程的父进程:",os.getppid()) #
Dean0731
2020/05/08
1.7K0
Python3 与 C# 并发编程之~ 进程篇中
接着上面继续拓展,补充说说获取函数返回值。 上面是通过成功后的回调函数来获取返回值,这次说说自带的方法:
逸鹏
2018/08/14
8290
Python3 与 C# 并发编程之~ 进程篇中
2018年8月25日多进程编程总结
今天遇到的新单词: terminal    n终端 terminate  v结束,使终结 basic        adj基本的
武军超
2018/09/27
6260
python 并发 ThreadPool
ThreadPoolExecutor和ProcessPoolExecutor ,一个线程池,一个进程池.
py3study
2020/01/08
1.2K0
[源码分析] 分布式任务队列 Celery 多线程模型 之 子进程
Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。
罗西的思考
2021/04/25
9620
[源码分析] 分布式任务队列 Celery 多线程模型 之 子进程
相关推荐
Python3 与 C# 并发编程之~ 进程篇下
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验