synchronisationsproblem mit subprocess und select
Verfasst: Donnerstag 15. September 2011, 15:01
Hallo Zusammen, bitte um Hilfe! Ich versuche, Prozesse zu Synchronisieren, die ich mit subprocess.Popen erzeuge. Das sieht im Elterprozess so aus:
und im Kindprozess recht einfach:
das Problem ist jetzt, dass der Elterprozess immer alle Aufräumarbeiten sofort macht. Das heißt, select gibt immer alle pipes als beschreibbar aus, obwohl die Kindprozesse noch lange nicht mit ihren Aufgaben fertig sind. Vermutlich ist eine Pufferung schuld? Allerdings steht die default auf 0, also keine Pufferung.
Kommentiere ich fsync nun ein, hängt der Elterprozess sich an der Stelle auf (logisch, irgendwie), wirft aber dann OSError: Invalid argument (weniger logisch)
Wäre sehr dankbar für Ratschläge...
Code: Alles auswählen
from select import select
import subprocess
from random import randint
from os import fsync
slots = []
writeme = []
jobdict = {}
for i in range(8):
slots.append(subprocess.Popen("./batchworker.py", stdin = subprocess.PIPE))
writeme.append(slots[-1].stdin)
while True:
workers = select([], writeme, [])[1]
for pipe in workers:
if pipe in jobdict:
done = jobdict.pop(pipe)
# WICHITG: hier sollte ein Kindprozess einen job erledigt haben, der Elterprozess macht Aufraeumarbeiten
jobId = randint(0, 99)
pipe.write(str(jobId) + '\n') # und hier bekommt der Kindprozess eine neue Aufgabe
pipe.flush()
# fsync(pipe.fileno()) # das ist auskommentiert, weil es einen anderen fehler verursacht
jobdict[pipe] = jobId
Code: Alles auswählen
while True:
job = int(stdin.readline())
# mach was laaangwieriges nuetzliches damit!
Kommentiere ich fsync nun ein, hängt der Elterprozess sich an der Stelle auf (logisch, irgendwie), wirft aber dann OSError: Invalid argument (weniger logisch)
Wäre sehr dankbar für Ratschläge...