Wenn ich Subprozess in Python umleiten stdout, bekomme ich einen sehr langsamen Durchsatz. Mache ich es falsch?Umleiten von stdout mit Subprozess in Python ist sehr langsam
Grundsätzlich übergebe ich die Standardausgabe eines externen Programms, um es in eine Warteschlange zu stellen. Dann drucke ich es in einer anderen Funktion in der Konsole.
Hier ist ein Beispielcode mit hexdump Zufall Ausgabe zu erzeugen:
from subprocess import Popen, PIPE
from queue import Queue
import sys
from threading import Thread, Event
import threading
class Buffer(Queue):
def __init__(self, *args, **kwargs):
Queue.__init__(self, *args, **kwargs)
def write(self, line):
self.put_nowait(line)
self.join()
def read(self):
element = self.get_nowait()
self.task_done()
return element
def write_output(buffer, stopped):
hexdump = Popen(['hexdump', '-C', '/dev/urandom'], stdout=PIPE)
while hexdump.returncode is None:
for line in hexdump.stdout.readlines(8192):
buffer.write(line)
if stopped.is_set():
hexdump.terminate()
hexdump.wait()
print('process terminated.')
break
def read_output(buffer, stopped):
while not stopped.is_set():
while not buffer.empty():
output = buffer.read()
print('********* output: {}'.format(output))
sys.stdout.flush()
print('stopped')
sys.stdout.flush()
buffer = Buffer()
stopped = Event()
generate_random_output = Thread(target=write_output, args=(buffer, stopped))
generate_random_output.name = 'generate_random_output'
generate_random_output.start()
process_output = Thread(target=read_output, args=(buffer, stopped))
process_output.name = 'process_output'
process_output.start()
try:
while True:
continue
except KeyboardInterrupt:
stopped.set()
generate_random_output.join()
process_output.join()
print('finished generating')
print('finished processing')
ich Hilfe schätzen würde.
Vielen Dank! Manchmal hängt stdout, also wollte ich 8192 hinzufügen, um die Ausgabe als Chunks zu erhalten, aber ich werde es auf diese Weise versuchen. –