synchronisationsproblem mit subprocess und select

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
zann
User
Beiträge: 1
Registriert: Donnerstag 15. September 2011, 13:43

Hallo Zusammen, bitte um Hilfe! Ich versuche, Prozesse zu Synchronisieren, die ich mit subprocess.Popen erzeuge. Das sieht im Elterprozess so aus:

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

und im Kindprozess recht einfach:

Code: Alles auswählen

while True:
	job = int(stdin.readline())
	# mach was laaangwieriges nuetzliches damit! 
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...
Antworten