0

data.file에 저장된 URL에서 일부 값 (추출 함수를 사용하여 얻음)을 얻으려고하고 있는데 파일에 약 3000000 개의 URL 링크가 있습니다 . 여기에 내 코드가있다bigdata의 python 코드에서 map()을 사용하여 멀티 프로세싱 작업

from multiprocessing import Pool 
p = Pool(10) 
revenuelist = p.map(extract, data.file) 

그러나 문제는 인터넷 연결로 인해 연결 문제가 발생하면 다시 실행된다는 것입니다. 내 코드에 내결함성을 어떻게 추가합니까 (동일한 작업을 반복하지 않도록 중간 결과 저장).

+0

작업이 URL을 가져 오는 경우 프로세스 대신 스레드를 사용할 것을 고려하십시오. – Udi

답변

0

아주 간단한 해결책은 파일을 사용하여 현재 상태를 저장하는 것입니다. 마지막으로 처리 할 수 ​​...하려고 사용하는 것은 실패

with open(FILENAME) as f: 
    current = int(f.read() or 0) 

if current: 
    skip_lines(current) 

try: 
    with Pool() as pool: 
     results = pool.imap(extract, data.file) 
     for result in results: 
      do_something(result) 
      current += 1 
finally: 
    with open(FILENAME, "w") as f: 
     f.write(str(current)) 

도 참조 : 'concurrent.futures` (많은 쿨러 multiprocessing.Pool보다).

보다 나은 해결책은 데이터베이스를 사용하여 진행 상황을 완전히 추적하고 더 나은 작업 대기열 (예 : celery)을 사용하여 작업을 실행하는 것입니다.

+0

이것은 다소 추한 것이며, 글로벌 상태가'map'의 이점을 없애 버립니다. OP는'extract'를 선택적인 반환 값으로 총 함수로 쉽게 변환 할 수 있고 재귀 적'map/filter/reduce' 전략을 사용하여 실패한 (empty) 경우에 성공한 호출과 실패한 호출을 반복 계산으로 나눕니다. –

+0

나는 이것이 추한 것에 동의한다 :-) 작업 대기열과 데이터베이스를 사용하는 것은 훨씬 더 깔끔하다. 그러나 이것이 일종의 배치 프로세스라면 그는 단 한 번만 실행되며 "재시작이 실패한 경우"기능이 필요하다. 충분하다 :-) – Udi

+0

"글로벌 상태가 맵의 이점을 없애는"의미는 무엇입니까? *지도의 유일한 목적은 1 대신 3000000 개의 작업을 n 개의 프로세스로 사용하는 것이고, imap은 좋을 것입니다. 여기 충분 해. – Udi