2015-06-15 2 views
6

Я написал веб-интерфейс vibe.d для clang-format, когда он представлен this input при использовании стиля LLVM, сервер зависает.Выполнение std.process синхронно с vibe.d иногда молча висит на сервере

Код для обработки 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.

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

Смежные вопросы