Ahoj,
nejsem úplně zběhlý v Pythonu a tak bych potřeboval poradit/vysvětlit věc, kterou teď při vývoji budu řešit.
Mám Flask server, pomocí kterého se budu dotazovat na databázi. Dotazy můžou být komplikované a jejich vyhodnocení může trvat velice dlouho (minuty, hodiny). Stejně tak může být velké i množství dat, kterými databáze přes stdout odpoví. Pro spouštění procesů používám subprocess.Popen a pro vyčítání stdout Popen.communicate. Proces dotazování by měl fungovat tak, že jedna routa flask serveru spustí proces a zapamatuje si referenci na Popen objekt. Druhá routa poskytuje informaci o stavu dotazu a třetí si pomocí communicate vytáhne stdout/stderr data a vrátí je jako výsledek.
Nicméně v dokumentaci Popen se píše i něco o tom, že by proces mohl naplnit OS buffery pro stdout/stderr. Mám obavu, že přesně toto by u mě mohlo nastat. Nejenže odpověď databáze může být opravdu hodně velká, ale zároveň se ve stejný moment může dotazovat více lidí na databázi. Jak to uvnitř funguje? Bude mít každý dotaz vlastní buffery, nebo je jeden buffer sdílen vícero procesy? Jak můžu ošetřit potenciální naplnění bufferů, aby nedošlo k deadlocku (jako se mi to už stalo s Popen.wait) a zároveň zachoval výše uvedený návrh chování aplikace (a především aby provádění jednoho dorazu nezablokovalo všem ostatním komunikaci se serverem).
Díky předem za odpovědi