Czy istnieje sposób rejestrowania wyjścia standardowego z danego procesu podczas korzystania z klasy wieloprocesowej.Proces w python?Dane wyjściowe dziennika przetwarzania wieloprocesowego. Przetwarzanie
Odpowiedz
Najprostszym sposobem może być po prostu przesłonięcie sys.stdout
. Nieznacznie modyfikując przykład z the multiprocessing manual:
from multiprocessing import Process
import os
import sys
def info(title):
print title
print 'module name:', __name__
print 'parent process:', os.getppid()
print 'process id:', os.getpid()
def f(name):
sys.stdout = open(str(os.getpid()) + ".out", "w")
info('function f')
print 'hello', name
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
q = Process(target=f, args=('fred',))
q.start()
p.join()
q.join()
i uruchomienie go:
$ ls m.py $ python m.py $ ls 27493.out 27494.out m.py $ cat 27493.out function f module name: __main__ parent process: 27492 process id: 27493 hello bob $ cat 27494.out function f module name: __main__ parent process: 27492 process id: 27494 hello fred
Można ustawić sys.stdout = Logger()
gdzie Logger
to klasa, której write
sposób (bezpośrednio lub gromadząc aż \n
zostanie wykryty) wywołuje logging.info
(lub jakikolwiek inny sposób chcesz się zalogować). An example of this in action.
Nie jestem pewien, co masz na myśli przez "dany" proces (kto go dał, co odróżnia go od wszystkich innych ...?), Ale jeśli masz na myśli to wiesz, jaki proces chcesz wyróżnić sposób, w jaki go tworzysz, możesz zawinąć jego funkcję target
(i tylko taką) - lub run
, którą nadpisujesz w podklasie Process
- w wrapper, który wykonuje to przekierowanie "sys.stdout" - i pozostawiać same inne procesy.
Może, jeśli przyswoisz sobie trochę specyfikację, mogę pomóc bardziej szczegółowo ...?
Są tylko dwie rzeczy, które mogę dodać do @Mark Rushakoff odpowiedź. Podczas debugowania, znalazłem to bardzo przydatne, aby zmienić parametr moich open()
połączeń buffering
0.
sys.stdout = open(str(os.getpid()) + ".out", "a", buffering=0)
inaczej, szaleństwa, bo gdy tail -f
ing plik wyjściowy wyniki mogą być verrry przerywany. buffering=0
dla tail -f
ing great.
I dla kompletności, zrób sobie przysługę i przekieruj także sys.stderr
.
sys.stderr = open(str(os.getpid()) + "_error.out", "a", buffering=0)
Ponadto, dla wygody można zrzucić że do osobnej klasy proces, jeśli chcesz,
class MyProc(Process):
def run(self):
# Define the logging in run(), MyProc's entry function when it is .start()-ed
# p = MyProc()
# p.start()
self.initialize_logging()
print 'Now output is captured.'
# Now do stuff...
def initialize_logging(self):
sys.stdout = open(str(os.getpid()) + ".out", "a", buffering=0)
sys.stderr = open(str(os.getpid()) + "_error.out", "a", buffering=0)
print 'stdout initialized'
To genialnie proste. – Cerin