Как реализовать схему обратного вызова / производителя / потребителей? - PullRequest
1 голос
/ 14 января 2012

Я разогреваюсь с Clojure и начал писать несколько простых функций.

Я понимаю, как язык явно подходит для параллельных вычислений, и это заставило меня задуматься.У меня есть приложение (написанное на Java, но неважно), которое работает следующим образом:

  • один поток ожидает ввода (файловая система в моем случае, но это может быть сеть иличто угодно) и помещает этот ввод, как только он поступает в очередь

  • несколько потребителей извлекают данные из этой очереди и обрабатывают данные параллельно

код, который помещает входные данные для параллельной обработки, может выглядеть следующим образом (это всего лишь пример):

asynchFetchInput( new MyCallBack() {
    public void handle( Input input ) {
        queue.put(input)
    }
})

Где asynchFetchInput будет порождать поток и затем вызывать обратный вызов.

Это действительно просто пример, но если бы кто-то мог объяснить, как сделать нечто подобное с помощью Clojure, это очень помогло бы мне понять «большую картину».

1 Ответ

3 голосов
/ 14 января 2012

Если вам нужно преобразовать данные, вы можете превратить их в последовательность, затем вы можете передать их либо map, либо pmap Последний будет обрабатывать их параллельно.filter и reduce также очень полезны;поэтому вы можете посмотреть, сможете ли вы выразить свою логику в этих терминах.

Возможно, вы захотите взглянуть на утилиты параллелизма в базовой Java, а не создавать свои собственные потоки.

...