如果函数在设定的时间内没有完成,我正在使用多处理来停止它。
这是我的代码:
<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')
答案 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
具有非零条目,直到该点为止,剩下的,不是计算的条目是零。