2017-10-20 2 views
1

설정 한 시간 내에 완료되지 않으면 기능을 중지하기 위해 멀티 프로세싱을 사용하고 있습니다.기능 파이썬을 종료하는 경우 부분 결과 가져 오기

다음
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 

지금 시간이 오래 걸립니다 함수의 내부에 아직

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

를 완료하지 않은 경우를 죽일, 값이 추가되고있다 : 여기

내 코드입니다 목록을 작성하고 함수가 완료되었는지 여부에 관계없이 목록에있는 상태로 가져 오려고합니다.

나는이 시도 사용하여 공유 배열 추가로 내부 기능, ̶하지만이 작동하지 않음 때 죽일 ̶p̶r̶o̶c̶e̶s̶s̶.̶

다음

내가했는데, 내가 공유 사전을 의미하는 것입니다하지 배열 :

def worker(number, dct): 
    for i in range(number): 
     x = do_things(i) #this can take a long time 
     dct[i] = x 

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

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

"공유 배열을 사용해 보았습니다."어떻게이 작업을 수행 했습니까? – roganjosh

+0

찾으시는 답변은 대기열이며 [docs] (https://docs.python.org/3.6/library/multiprocessing.html?highlight=multiprocessing#exchanging-objects-between-processes)에서 찾을 수 있습니다. – pstatix

+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') 

문제를 시뮬레이트하기 위해 예제를 약간 수정했습니다. arrmultiprocessing.Array 유형의 공유 배열입니다. 초기화하려면 저장하려는 유형 (여기에 'd'을 두 번 입력해야 함)과 크기가 필요합니다. 여기서 최대 반복 횟수는 20이므로 배열 크기도 20으로 설정됩니다.이 프로세스는 중지 될 때까지 함수의 배열을 채우며 그 결과 배열 arr은 계산 될 수 없을 때까지 그 지점까지 0이 아닌 항목을 갖습니다 엔트리가 0입니다.