2016-12-06 1 views
0

Aujourd'hui, j'ai écrit cet article Multiprocessing Error with Results.Commande d'impression multitraitement sans structure

Maintenant, je modifié ce script:

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) 

J'ai inséré quelques impressions des commandes aux classes. Mais le résultat est une impression sans structure, comme ceci:

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] 

Les impressions dans les classes que je veux juste une fois ... Le texte « Je suis dans la Fonction test » Je veux plusieurs (10 fois).

Est-ce que quelqu'un peut-être une solution?

+0

Pouvez-vous me donner un exemple de code s'il vous plaît? Je ne comprends pas exactement comment vous voulez dire que ... – John28

Répondre

1

Comme je l'ai (mal) essayé d'expliquer dans un commentaire (maintenant supprimé), vous pouvez le faire en ajoutant un argument optionnel avec une valeur par défaut de la fonction init() (et aux méthodes de classe):

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) 

Sortie:

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: Une autre façon de rendre une classe "callable" comme vous voulez est en définissant un ['__call__()'] (https://docs.python.org/3 /reference/datamodel.html#object.__call__) méthode. Ce serait préférable de remplacer la classe par une instance de lui-même (la technique 'class1 = class1()' que vous utilisez actuellement pour le faire). – martineau

+0

@martinuea: Je ne comprends pas pourquoi le texte "Cette variable est appelable" et "Et celui-ci est aussi appelable" sont imprimés après la fonction Testfunction-print et la classe print? La commande est avant que le multitraitement ne commence. Et que dois-je changer pour obtenir les classes class1 et class2 avant la fonction Testfunction-print? La séquence que j'attends est "This variable .." et "And this one ...", puis "Initfunction", "class1" "class2", "Testfunction", et au moins les nombres dans la variable résultats ... – John28

+0

L'ordre étrange de la sortie est parce qu'il provient de plusieurs processus différents qui s'exécutent tous en même temps, ce qui fait que certains essaient d'imprimer des choses sur la même console partagée simultanément. Je suis surpris qu'il ne s'agisse pas d'un méli-mélo ... – martineau