2013-07-10 3 views
3

이 코드는 온라인에서 발견되었으며 예측 된 결과는 현재 처리중인 프로세스 이름을 표시하기로되어 있었지만 코드를 실행하면 결과 만 제공하고 이름은 제공하지 않습니다. 윈도우 7 파이썬 2.7.3을 실행하는 임.Python 다중 처리가 예상대로 작동하지 않습니다.

코드 :

import multiprocessing 

def do_calculation(data): 
    return data * 2 

def start_process(): 
    print 'Starting', multiprocessing.current_process().name 

if __name__ == '__main__': 
    inputs = list(range(10)) 
    print 'Input :', inputs 

    builtin_outputs = map(do_calculation, inputs) 
    print 'Built-in:', builtin_outputs 

    pool_size = multiprocessing.cpu_count() * 2 
    pool = multiprocessing.Pool(processes=pool_size, 
           initializer=start_process, 
           ) 
    pool_outputs = pool.map(do_calculation, inputs) 
    pool.close() # no more tasks 
    pool.join() # wrap up current tasks 

    print 'Pool :', pool_outputs 

예상 결과 :

$ python multiprocessing_pool.py 

Input : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Built-in: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
Starting PoolWorker-11 
Starting PoolWorker-12 
Starting PoolWorker-13 
Starting PoolWorker-14 
Starting PoolWorker-15 
Starting PoolWorker-16 
Starting PoolWorker-1 
Starting PoolWorker-2 
Starting PoolWorker-3 
Starting PoolWorker-4 
Starting PoolWorker-5 
Starting PoolWorker-8 
Starting PoolWorker-9 
Starting PoolWorker-6 
Starting PoolWorker-10 
Starting PoolWorker-7 
Pool : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
+4

왜 그렇게 될 것으로 예상 했습니까? 붙여 넣은 출력이 표시된 코드와 관련하여 올바른 동작을하는 것처럼 보입니다. – Gian

+0

제 생각에'do_calculation' 본문을'return (data * 2, multiprocessing.current_process() .name)'처럼 보이게하려면'data * 2'와 worker 이름을 튜플. – sberry

+0

multiprocessing.cpu_count()가 반환하는 것을 확인해 보셨습니까? – fsw

답변

1

나는 콘솔에서 다음 코드를 실행하면하지 IDLE (내가 PyCharm 사용 후 뒤로 계속하는) :

from multiprocessing import * 

def main(): 
    data = list(range(10)) 
    print('Data:', data) 

    result = list(map(calculate, data)) 
    print('Map: ', result) 

    pool = Pool(cpu_count() * 2, initialize) 
    result = pool.map(calculate, data, 1) 
    pool.close() 
    pool.join() 

    print('Pool:', result) 

def calculate(number): 
    return number * 2 

def initialize(): 
    print('Starting', current_process().name) 

if __name__ == '__main__': 
    main() 
C:\Users\schappell\Desktop>stack_overflow.py 
Data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Map: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
Starting PoolWorker-1 
Starting PoolWorker-13 
Starting PoolWorker-2 
Starting PoolWorker-3 
Starting PoolWorker-8 
Starting PoolWorker-5 
Starting PoolWorker-14 
Starting PoolWorker-16 
Starting PoolWorker-15 
Starting PoolWorker-12 
Starting PoolWorker-6 
Starting PoolWorker-9 
Starting PoolWorker-4 
Starting PoolWorker-10 
Starting PoolWorker-7 
Starting PoolWorker-11 
Pool: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

C:\Users\schappell\Desktop> 

측면 참고로, (주석으로하고 time.sleep없이) 대신 다음 코드를 실행 해보십시오 :다음은 예상대로 (PoolWorkers에 대한 임의의 순서로) 콘솔 화면에 출력되는 다음 :

C:\Users\schappell\Desktop>stack_overflow.py 
Data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Map: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
Starting PoolWorker-2 
Pool: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
Starting PoolWorker-1 
Starting PoolWorker-10 
Starting PoolWorker-9 
Starting PoolWorker-6 
Starting PoolWorker-14 
Starting PoolWorker-13 
Starting PoolWorker-5 
Starting PoolWorker-4 
Starting PoolWorker-3 
Starting PoolWorker-8 
Starting PoolWorker-11 
Starting PoolWorker-12 
Starting PoolWorker-16 
Starting PoolWorker-7 
Starting PoolWorker-15 

C:\Users\schappell\Desktop> 
: 슬립없이

from multiprocessing import * 
import time 

def main(): 
    data = list(range(10)) 
    print('Data:', data) 
    print('Map: ', list(map(calculate, data))) 
    pool = Pool(cpu_count() * 2, initialize) 
## time.sleep(1) 
    print('Pool:', pool.map(calculate, data, 1)) 
    pool.close() 
    pool.join() 

def calculate(number): 
    return number * 2 

def initialize(): 
    print('Starting', current_process().name) 

if __name__ == '__main__': 
    main() 

,이 같은 (풀 완전히 아직 생성되지 않은 보여주는)받을 수 있습니다

관련 문제