2010-05-05 6 views
12

Ho un problema con il codice sottostante e con qualsiasi codice che utilizza la funzione print nei processi figli. Non riesco a visualizzare alcuna dichiarazione stampata, anche se utilizzo sys.std[err|out].write('worker') anziché print.I processi figlio creati con il modulo multiprocessing python non verranno stampati

Questo è il codice (from the official python documentation):

from multiprocessing import Process 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

L'uscita è vuoto.

Nota: Il codice seguente utilizza il modulo threading e stampa l'uscita:

import threading 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = threading.Thread(target=f, args=('bob',)) 
    p.start() 
    p.join() 

uscita: hello bob

Potete per favore mi punto alla soluzione? Grazie in anticipo.

risposta

19

Prova questo:

from multiprocessing import Process 
import sys 

def f(name): 
    print 'hello', name 
    sys.stdout.flush() 

... 

AFAIK lo standard output trasformati generato dal modulo multiprocessing è tamponata, quindi, si vedrà l'uscita solo se il buffer è pieno o esplicitamente filo sys.stdout.

+0

Grazie mille Tamas, ma nel mio caso non ha funzionato ... – John

+0

Quale piattaforma sei? Quanto sopra funziona per me su Mac OS X; in effetti, funziona anche senza svuotare sys.stdout. –

+1

Tamas, la piattaforma su cui sto lavorando è win32. A proposito, fino ad ora ho provato a eseguire il codice all'interno di IDLE. Oggi ho provato ad eseguirlo dalla riga di comando, usando questa sintassi: python.exe my_prog.py e ha funzionato. Qualcuno sa perché? E come posso visualizzare l'output di stampa eseguendo programmi all'interno di IDLE? – John

3

I documenti per il multiprocessing spiegano chiaramente why questo non funzionerà!

"Nota:.. Funzionalità all'interno di questo pacchetto richiede che il metodo __main__ essere importabili dai bambini Questo è trattato nelle linee guida di programmazione Tuttavia vale la pena sottolineare qui Questo significa che alcuni esempi, come gli esempi multiprocessing.Pool volontà non funziona nell'interprete interattivo. "

+0

Innanzitutto grazie per la risposta. Quello che ho fatto è scrivere il codice in un file chiamato "example.py" e premere F5 per eseguirlo. Forse questo significa "codice in esecuzione in IDLE"? PS: Sono un novizio pitone, mi dispiace per qualsiasi cosa (eccessivamente) ovvia che potrei aver affermato qui. – John

+0

Ah, beh, sì IDLE con il prompt ">>" conta come interprete interattivo. Quindi la multiprocessing fondamentalmente non funzionerà a meno che non si scriva il codice in un file e si prenda F5 come si dice o si digiti "python example.py" nel prompt dei comandi. Posso capire come questo potrebbe essere un problema di confusione. Prego. – manifest

-2

Ottieni PyCharm, ho avuto lo stesso errore e ci ho lavorato per + -5 ore. Finalmente ho ottenuto Pycharm su Anaconda e ho ottenuto l'output. Ha qualcosa a che fare con la versione Windows dell'interprete IPhython.

Problemi correlati