当前位置:首页 >> 编程语言 >> 【python】[subprocess库] 优雅的并发模板:并发,多进程管理与交互,火狐浏览器3.5

【python】[subprocess库] 优雅的并发模板:并发,多进程管理与交互,火狐浏览器3.5

0evadmin 编程语言 1
文件名:【python】[subprocess库] 优雅的并发模板:并发,多进程管理与交互,火狐浏览器3.5 【python】[subprocess库] 优雅的并发模板:并发,多进程管理与交互 需求

1> 创建多个进程,并发执行多个终端指令 2> 每个进程的进程号不同(以供记录,并在异常退出时进行进程清理) 3> 每个子进程的输出可被python变量记录 (别问,就是想看) 4> 这些子进程的输出不要显示在终端上 (别问,就是不想看)

一套自用模板

进程创建

import subprocess #fork进程import tempfile #临时文件child_process = [] #记录所有子进程,以供清理def sub_boot():command = 'your shell command'with tempfile.NamedTemporaryFile(delete=True) as temp_file:process = subprocess.Popen(command, shell=True,stdout=temp_file, # write into temp_filestderr=sys.stdout, # output into you terminalprexxes_fn=os.setsid) # create new process-id # do anything you like with process,like recordchild_process.append(process)# because below process would not stop your main processprocess,wait() # 阻塞主进程,等待子进程结束with open(temp_file.name,'r') as file:txt = file.read()# after this line , the temp_file would be auto-deletedprint(txt)# do anything you like with txt sub_boot()

进程清理

import osimport signalchild_process = []def sub_kill(process):main_pid = os.getpid() #获得主进程的进程号try: #防止进程已经关闭导致的报错pgid = os.getpgid(process.pid) #获取进程idif pgid != main_pid: #防止杀死自己os.killpg(pgid,signal.SIGTERM) #这个信号相当于 ctrl+Cos.killpg(pgid,signal.SIGKILL) # 这个信号会强行杀死else:passexcept:passdef clean_all():for process in child_process:sub_kill(process)child_process=[]
协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接