2016-12-06 26 views
0

오늘 나는이 게시물 Multiprocessing Error with Results을 작성했습니다. 구조가없는 다중 처리 인쇄 명령

import multiprocessing 

class class1(): 
    def classfunction1(self, a): 
     self.x = a 
     print("class 1") 


class class2(): 
    def classfunction2(self, a): 
     self.y = a 
     print("class 2") 

def test(i): 
    print("I'm in the Testfunction") 
    b = i * class1.x * class2.y 

    return b 

def init(): # added 
    print("I'm in the Initfunction") 
    global class1, class2 
    class1 = class1() 
    class2 = class2() 
    x = 1 
    y = 2 
    class1.classfunction1(x) 
    class2.classfunction2(y) 

if __name__ == "__main__": 
    init() # explicit call here 
    print("This variable is callable", class1.x) 
    print("And this one is also callable", class2.y) 
    counter = [] 
    for i in range(10): 
     counter.append(i) 
    pool = multiprocessing.Pool(initializer=init, processes=4) # implicit call 
    results = pool.imap(test, counter) 
    pool.close() 
    pool.join() 
    resultslist = list(results) 
    print(resultslist) 

내가 클래스에 일부 인쇄 명령을 삽입 :

는 지금은이 스크립트를 수정했습니다. 그러나 결과는이 같은 structureless 인쇄 인 : 난 그냥 한 번에 원하는 클래스의

I'm in the Initfunction 
class 1 
class 2 
This variable is callable 1 
And this one is also callable 2 
I'm in the Initfunction 
class 1 
class 2 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Initfunction 
class 1 
class 2 
I'm in the Initfunction 
class 1 
class 2 
I'm in the Initfunction 
class 1 
class 2 
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

프린트 물 ... 텍스트 만 내가 여러 (10 회) 원하는 "나는 Testfunction에있어".

가능성이있는 해결책이 있습니까?

+0

예제 코드를 제공해 주시겠습니까? 나는 당신이 그 의미를 정확히 이해하지 못한다 ... – John28

답변

1

나는 (잘못) 주석 (지금 삭제)에 설명하려고 노력으로, 당신은 (그리고 클래스 메소드로)에 init() 기능에 기본 값으로 선택적 인수를 추가하여 작업을 수행 할 수 있습니다

from __future__ import print_function 
import multiprocessing 
import sys 

sys_print = print # save built-in print function before replacement is defined 

def print(*args, **kwargs): 
    """Replacement for built-in that flushes output stream after each call.""" 
    sys_print(*args, **kwargs) 
    stdout = kwargs.get('file', sys.stdout) 
    stdout.flush() # force any buffered output to be displayed 

class class1(): 
    # note addition of optional argument with default value 
    def classfunction1(self, a, notify=False): 
     self.x = a 
     if notify: print("class 1") 

class class2(): 
    # note addition of optional argument with default value 
    def classfunction2(self, a, notify=False): 
     self.y = a 
     if notify: print("class 2") 

def test(i): 
    print("I'm in the Testfunction") 
    b = i * class1.x * class2.y 

    return b 

def init(notify=False): # note addition of optional argument with default value 
    if notify: print("I'm in the Initfunction") 
    global class1, class2 
    class1 = class1() 
    class2 = class2() 
    x = 1 
    y = 2 
    class1.classfunction1(x, notify) 
    class2.classfunction2(y, notify) 

if __name__ == "__main__": 
    init(True) # override default arg in this explicit call 
    print("This variable is callable", class1.x) 
    print("And this one is also callable", class2.y) 
    counter = list(range(10)) 
    pool = multiprocessing.Pool(initializer=init, processes=4) # implicit calls 
    results = pool.imap(test, counter) 
    pool.close() 
    pool.join() 
    resultslist = list(results) 
    print(resultslist) 

출력 :

I'm in the Initfunction 
class 1 
class 2 
This variable is callable 1 
And this one is also callable 2 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
I'm in the Testfunction 
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
+0

FYI : 원하는대로 클래스를 "호출 가능"하게 만드는 또 다른 방법은 ['__call__()'] (https://docs.python.org/3)를 정의하는 것입니다. /reference/datamodel.html#object.__call__) 메소드를 사용하십시오. 이것은 클래스를 자신의 인스턴스로 대체하는 것이 바람직합니다 (현재이 작업을 수행하는'class1 = class1()'기법). – martineau

+0

@martinuea : "이 변수는 호출 가능하다"라는 텍스트와 "이 코드도 호출 가능합니다"라는 텍스트가 Testfunction-print 및 클래스 인쇄 후에 왜 인쇄되는지 이해할 수 없습니까? 명령은 다중 처리가 시작되기 전입니다. 그리고 Testfunction-print 전에 class1과 class2를 가져 오려면 어떻게 변경해야합니까? 내가 기대하는 순서는 "이 변수 .."와 "그리고이 하나 ...", "Initfunction", "class1" "class2", "Testfunction"그리고 적어도 변수 결과의 숫자입니다 ... – John28

+0

출력의 이상한 순서는 여러 개의 다른 프로세스가 모두 동시에 실행되고 있기 때문에 동일한 공유 콘솔에 항목을 동시에 인쇄하려고하기 때문에 발생합니다. 나는 그것이 이상한 냄새가 아니었다는 것에 놀랐습니다. – martineau