Выполнение std.process синхронно из vibe.d иногда молча зависает на сервере
Я написал vibe.d
веб-интерфейс для clang-format
при представлении этого ввода при использовании стиля LLVM сервер зависает.
Код для обработки POST:
void post(string style, string code)
{
import std.algorithm;
import std.file;
import std.conv;
import std.process;
auto pipes = pipeProcess(["clang-format", "-style="~style], Redirect.stdout | Redirect.stdin);
scope(exit) wait(pipes.pid);
pipes.stdin.write(code);
pipes.stdin.close;
pipes.pid.wait;
code = pipes.stdout.byLine.joiner.to!string;
string selectedStyle = style;
render!("index.dt", styles, code, selectedStyle);
}
Это, вероятно, не следует делать блокирующим образом, но я не знаю, как это сделать асинхронно. Я попытался обернуть содержимое функции в runTask
, но я не мог придумать, как правильно это назвать.
Как я могу сделать это надежным?
1 ответ
Вы, вероятно, пишете слишком много данных в программу stdin
не читая его stdout
, Поскольку размер буфера канала ограничен, это приводит к тому, что исполняемая программа блокируется при записи в ее stdout
что в свою очередь приводит к блокировке вашей программы при записи в ее stdin
,
Решение состоит в том, чтобы читать данные, когда вы их пишете. Простой способ сделать это - создать второй поток, который читает данные, в то время как основной поток записывает их.