2014-12-03 1 views
0

기본적으로 다른 모듈에서 가져온 항목이 많을수록 모듈 기능이 전혀 사용되지 않아도 이러한 다중 처리 작업이 더 오래 걸립니다. 각 프로세스가 모든 것을 다시 가져와야합니까? 무슨 일 이니?가져 오기에 다중 처리 비용이 들게되는 이유는 무엇입니까?

import time 

time1 = time.time() 

import multiprocessing as mp 
import numpy as np # Random imports (not used) 
import PIL 
import PySide 
import pandas 
# print time.time() - time1 # here this prints 0.0 

class Multi(object): 
    def __init__(self, queue): 
     self.q = queue  
    def run(self, a): 
     p = mp.Process(target=f, args=(a, q)) 
     p.start() 
     print self.q.get() 
     p.join() 


class MultiPool(object): 
    def __init__(self, N): 
     self.N = N 
     self.pool = mp.Pool(processes = self.N)  
    def run(self): 
     result = self.pool.map_async(f1, ((i,) for i in range(self.N))) 
     print result.get() 


def f(a, q): 
    for i in range(10000000): 
     b = i 
    q.put(b) 

def f1(a): 
    for i in range(10000000): 
     b = i 
    return b 

if __name__ == '__main__': 

    q = mp.Queue() 
    e = Multi(q) 

    # time1 = time.time() 
    print f1(0) 
    print time.time() - time1 

    time1 = time.time() 
    e.run('123') 
    print time.time() - time1 

    time1 = time.time() 
    mpool = MultiPool(2) 
    mpool.run() 
    print time.time() - time1 

# Output with random imports: 
>9999999 
>0.246000051498 
>9999999 
>0.693000078201 
>[9999999, 9999999] 
>0.720999956131 

# Output without imports: 
>9999999 
>0.246000051498 
>9999999 
>0.315999984741 
>[9999999, 9999999] 
>0.313999891281 
+0

스크립트의 출력을 게시하십시오 –

+0

수입품을 제거하기 위해 무엇을합니까? 두 번째 산출물은 어떻게 얻습니까? –

+0

은 사용되지 않은 가져 오기를 주석으로 처리합니다. 더 많은 수입을 더하면 멀티 프로세싱 출력이 더 오래 걸립니다. – kezzos

답변

1

multiprocessing과정 (새 응용 프로그램) 및 스레드 수없는 이유만으로 어떠한 사전 처리에 모든 것을 가져와야합니다.

스크립트로 측정 할 것은 방법 실행 비용 에 프로세스 생성 비용 인을 더한 것입니다. 수입 비용을 측정 할 수 있으며 정확히 import 진술이있는 위치에서 실행됩니다.

+0

첫 번째 time.() 블록에는 추가 가져 오기로 인한 패널티가 표시되지 않습니다. 함수를 실행하기 전에 import가 __main__에 설정되어 있습니까? – kezzos

+0

@kezzos는 진짜 퍼즐입니다. 이제 나는 타블렛에서. 나중에해볼 게. –

관련 문제