python代码运行到一半终止_python多处理。池终止*特定*长时间运行或挂起的进程...

我需要执行一个包含许多并行数据库连接和查询的池。我想使用多处理.Pool或concurrent.futures ProcessPoolExecutor。Python2.7.5

在某些情况下,查询请求耗时太长或永远无法完成(挂起/僵尸进程)。我想从已超时的multiprocessing.Pool或concurrent.futures ProcessPoolExecutor中终止特定的进程。

下面是一个如何终止/重新生成整个进程池的示例,但理想情况下,我会尽量减少CPU抖动,因为我只想终止一个特定的长时间运行的进程,该进程在超时秒后没有返回数据。

由于某些原因,在返回并完成所有结果后,下面的代码似乎无法终止/加入进程池。这可能与超时时终止工作进程有关,但是池在终止新的工作进程时创建新的工作进程,并且结果与预期一致。from multiprocessing import Pool

import time

import numpy as np

from threading import Timer

import thread, time, sys

def f(x):

time.sleep(x)

return x

if __name__ == '__main__':

pool = Pool(processes=4, maxtasksperchild=4)

results = [(x, pool.apply_async(f, (x,))) for x in np.random.randint(10, size=10).tolist()]

while results:

try:

x, result = results.pop(0)

start = time.time()

print result.get(timeout=5), '%d done in %f Seconds!' % (x, time.time()-start)

except Exception as e:

print str(e)

print '%d Timeout Exception! in %f' % (x, time.time()-start)

for p in pool._pool:

if p.exitcode is None:

p.terminate()

pool.terminate()

pool.join()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值