python多进程优化_Python 的多进程,考虑到会发生死进程,如何收敛结束,安全又方便?...

uti6770werty

145 天前

@nightwitch 感谢链接,应该就是我要找的帮助,谢谢!

@ClericPy 感谢告知可以根据 debugging-port 的方式 kill chrome

试着写了个模拟的程序,进程是被停下来了,但是这个进程池好像再也用不料了。。。

```

# coding=utf-8

import codecs

import difflib

import os.path

import re

import time

import string

import chardet

import shutil

import copy

from concurrent.futures import ProcessPoolExecutor

import datetime

def PrintCount(PName):

if PName == '甲':

DelayTime = 0.9

if PName == '乙':

DelayTime = 1.2

if PName == '丙':

DelayTime = 1.7

if PName == '丁':

DelayTime = 2

if PName == '戊':

DelayTime = 2.5

countt = 0

while True:

countt += 1

time.sleep(DelayTime)

print(f'{PName}池:->',f'{countt}')

if __name__ == '__main__':

StartTime = time.clock()

FutureDict = {}

FutureRetDict = {}

FutureTimeRecoderDict = {}

PoolNameList = ["甲", "乙", "丙", "丁", "戊"]

# 初始化进程池

for i in range(len(PoolNameList)):

# 进程

FutureDict.update({PoolNameList[i]: ProcessPoolExecutor(max_workers=1)})

# 进程 Ret

FutureRetDict.update({PoolNameList[i]: futures.Future()})

# 进程启动时间

FutureTimeRecoderDict.update({PoolNameList[i]: None})

# 模拟测试清空进程池的信号

closeflag = True

# 开始工作

while True:

ProcessNum = 0

# 增加任务

for ProcessName,FutureRet in FutureRetDict.items():

# 模拟 40 秒后终结 [乙] 进程池

if closeflag == True:

if time.clock() - StartTime >= 40: # 在启动 40 秒后触发

print(f"开始强制结束 [乙] 进程池")

for pid, process in FutureDict['乙']._processes.items():

process.terminate()

FutureDict['乙'].shutdown()

closeflag = False

time.sleep(15)

# 如果进程池在运行

if FutureRet.running() == True:

pass

else:

# 增加任务

FutureRetDict[ProcessName] = FutureDict[ProcessName].submit(PrintCount,ProcessName)

print(f'{ProcessName} 进程池提交了开始.')

time.sleep(2)

break

time.sleep(3)

```

40 秒之后,乙进程池的确被停了,但是再向乙进程池提交任务的时候,会提示:

```

甲池:-> 57

甲池:-> 58

丙池:-> 25

戊池:-> 13

甲池:-> 59

丁池:-> 19

甲池:-> 60

丙池:-> 26

Traceback (most recent call last):

File "D:/TestForMu.py", line 80, in

FutureRetDict[ProcessName] = FutureDict[ProcessName].submit(PrintCount,ProcessName)

File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\concurrent\futures\process.py", line 452, in submit

raise BrokenProcessPool('A child process terminated '

concurrent.futures.process.BrokenProcessPool: A child process terminated abruptly, the process pool is not usable anymore

甲池:-> 61

戊池:-> 14

丁池:-> 20

丙池:-> 27

```

应该要做些什么事情,再次启用?

原谅我这样设计流程,也许不是科学的,只是尽早希望能跑起多进程,把问题解决了就好。。。^_^

谢谢大家解答!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值