如果终止函数python,则得到部分结果

时间:2017-10-20 20:24:18

标签: python multiprocessing

如果函数在设定的时间内没有完成,我正在使用多处理来停止它。

这是我的代码:

<h1>CSS GRID</h1>
<div class="container">
  <div class="item header">Header</div>
  <div class="cms-annoying-wrapper">
    <div class="item sidebar">Sidebar</div>
    <div class="item content">Content</div>
  </div>
  <div class="item footer">Footer</div>
</div>

如果尚未完成,则杀死它

def worker(number):
     result = []
     for i in range(number):
         x = do_things(i) #this can take a long time
         result.append(x)
     return result

p = multiprocessing.Process(target=worker, args=(random_number,))
p.start()
p.join(10) # Will timeout after 10 seconds

现在在需要很长时间的函数内部,值被附加到列表中,并且我希望将该列表置于其所处的状态,而不管函数是否已完成。

我曾尝试使用共享阵列和附加到它在函数内,̶但这并不工作时,我杀̶p̶r̶o̶c̶e̶s̶s̶.̶

这是我尝试过的,我的意思是共享字典,而不是数组:

if p.is_alive():
    p.terminate()
    p.join()
    print('killed process because it took too long')
else:
    p.join()
    print('process finished')

1 个答案:

答案 0 :(得分:0)

您可以使用multiprocessing模块

中的共享阵列
import multiprocessing
from time import sleep
import random, math

def worker(number, shared_arr):
    for i in range(number):
        x = do_things(i)
        shared_arr[i] = x

def do_things(n):
    sleep(random.randint(1,2))
    return math.sqrt(n)

arr = multiprocessing.Array('d', 20)

random_number = random.randint(1,20)
p = multiprocessing.Process(target=worker, args=(random_number, arr,))
p.start()
# Will timeout after 10 seconds
p.join(10)

if p.is_alive():
    p.terminate()
    p.join()
    print(arr[:])
    print('killed process because it took too long')
else:
    p.join()
    print(arr[:])
    print('process finished')

我稍微修改了您的示例来模拟您的问题。 arr是共享数组,是multiprocessing.Array类型的对象。要初始化它,它需要它要存储的类型(这里为'd'为double)和大小。由于此处的最大迭代次数将为20,因此数组大小也设置为20.该过程将填充函数中的数组,直到它停止并且结果数组arr具有非零条目,直到该点为止,剩下的,不是计算的条目是零。