Мне нужно выполнить пул из множества параллельных подключений и запросов к базе данных. Я хотел бы использовать multiprocessing.Pool или concurrent.futures ProcessPoolExecutor. Python 2.7.5python multiprocessing.Pool kill * specific * long running или hung process
В некоторых случаях запросы запросов занимают слишком много времени или никогда не будут завершены (процесс зависания/зомби). Я хотел бы убить конкретный процесс из многопроцессорного процесса.Pool или concurrent.futures ProcessPoolExecutor, который истекло.
Вот пример того, как убить/повторно запустить весь пул процессов, но в идеале я бы свести к минимуму перегрев процессора, так как я хочу только убить определенный длительный процесс, который не возвратил данные после таймаута секунд.
По какой-то причине приведенный ниже код, похоже, не может завершить/объединить пул процессов после того, как все результаты будут возвращены и завершены. Возможно, это связано с убийством рабочих процессов, когда происходит тайм-аут, однако Пул создает новых работников, когда они убиты, а результаты ожидаются.
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()
Это предполагает, что нет других активных детей, которые ** не являются ** частью бассейна. –