Experiments never fail s2

실험에 실패란 없다 블로그 시즌 2

파이썬 멀티프로세싱 순차적으로

Pythonist - 2013년 4월 19일 12:17:42 오전

NGS 파일들 다루다 보니 죽치고 기다려야 하는 경우가 많아 CPU도 많겠다 멀티프로세싱으로 만드는 중 알게 된 팁하나.

multiprocessing 모듈의 Poll 인스턴스 메쏘드 imap이 그때그때 바로 결과를 주는 점에 착안, 얘 혹시 입력으로 반복자(iterator)를 줘도 도나 보니 잘 되네. 이러면 입력과 출력을 순차적으로 이어줄 수 있지. 파이프(|)로 활용 가능.

import multiprocessing, time, random

def square(x):
    sec = random.choice([1, 2, 3])
    print('before {0} wait {1} sec'.format(x, sec))
    time.sleep(sec)
    print('after {0}'.format(x))
    return x * x

def g(n):
    i = 0
    while i < n:
        yield i
        i += 1

pool = multiprocessing.Pool(processes=4)
for each in pool.imap(square, g(20)):
    print(each, flush=True)

위 코드를 돌려보면 함수 square의 실행이 비동기적이면서도 그때그때 결과가 나오고 순서는 보존됨을 알 수 있다. 입력을 제너레이터로 해도 됨. 즉 다음과 같은 코드가 가능하다.

import sys, multiprocessing

def upper(line):
    return line.upper()

p = multiprocessing.Pool(processes=4)
for line in p.imap(upper, sys.stdin):
    sys.stdout.write(line)
    sys.stdout.flush()
p.close()

파일을 라인단위로 읽어 대문자로 바꿔주는데 4개 프로세스로 진행된다. 만일 순서를 보장하지 않아도 된다면 imap_unordered 로 좀 더 빠르게 돌릴 수 있다.


Posted by Hyungyong Kim (yong27)

태그(들): NGS, imap, iterative, multiprocessing, poll, python


comments powered by Disqus

« 미국에서 운전하기

PyCon 2013에 다녀와서 »