Выполнение 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,

Решение состоит в том, чтобы читать данные, когда вы их пишете. Простой способ сделать это - создать второй поток, который читает данные, в то время как основной поток записывает их.

Другие вопросы по тегам