две последовательные задачи медленнее, чем параллельные - PullRequest
0 голосов
/ 09 февраля 2010

Привет, у меня есть веб-приложение - и одним способом мне нужно зашифровать часть данных из запроса, сохранить их на диске и вернуть ответ.

Ответ никак не связан с шифрованием.

Однако шифрование требует довольно много времени. Как сделать темы или так правильно в этой задаче?

Я пробовал что-то вроде

Резьба нить ...

Thread.start ();

или

JobDetail job = encryptionScheduler.getJobDetail (jobDetail.getName (), jobDetail.getGroup ());

encryptionScheduler.scheduleJob (jobDetail, TriggerUtils.makeImmediateTrigger ( "encryptionTrigger", 1,1)

Я попробовал сервлет, где перед шифрованием я закрываю outpuStream.

или: Executors.newFixedThreadPool (1);

Но что бы я ни пытался, клиент должен ждать дольше.

кстати: почему это так? Это может быть быстрее?

Я не пытался запустить поток после инициализации контекста и как-то ждать, пока метод не нуждается в шифровании.

как ускорить это?

спасибо

-------------- EDIT: // Я использую ось 1.4, где у меня есть обработчик, который в методе invoke шифрует значение:

try {
    LogFile logFile = new LogFile(strategy,nodeValue,path, new Date());
    LogQueue.queue.add(logFile);
    }
    catch (Exception e) {
        log.error(e.getMessage(),e);
    }

EExecutor.executorService.execute(new Runnable() {
            public void run() {
                try {
                LogFile poll = LogQueue.queue.poll();
                String strategy = poll.getStrategy();
                    String value = poll.getNodeValue();
                    value = encrypt(strategy,value);
                    PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(poll.getPath(), true )),"UTF-8"));
                    writer.print(value);
                    writer.close();
                }catch (IOException e  ) {
                    log.error(e.getMessage(),e);
                } 
            }

        });
        } catch (Throwable e ) {
            log.error(e.getMessage(),e);
        }

// кроме того у меня есть служба исполнителя

public class EExecutor { public static ExecutorService executorService = Executors.newCachedThreadPool();}

// и что действительно интересно .. когда я перемещаю шифрование из этого обработчика в другой обработчик, который называется последний раз, когда я отправляю ответ! Это быстрее Но когда я оставляю это в одном из первых обработчиков, когда получаю запрос. Это даже медленнее без использования потоков / сервлетов и т. Д.

Ответы [ 2 ]

5 голосов
/ 09 февраля 2010

Потоки помогают вам, только если часть вашей задачи может выполняться параллельно. Похоже, вы ждете завершения шифрования, прежде чем вернуть результат. Если вам необходимо сделать это (например, потому что зашифрованные данные - это результат), то выполнение шифрования в отдельном потоке вам здесь не поможет - все, что вам нужно, это ввести накладные расходы создания и переключения на другой поток.

Редактировать: Если вы запускаете новый поток для каждого выполняемого вами шифрования, то это может быть частью вашей проблемы. Создание новых тем относительно дорого. Лучше всего использовать ExecutorService с неограниченной очередью. Если вас не волнует порядок, в котором происходит этап шифрования (т. Е. Если все в порядке, то шифрование, которое началось из-за запроса в момент времени t, заканчивается позже, чем то, которое началось в момент времени t ', и t ExecutorService иметь более одного потока. Это обеспечит вам больший параллелизм и избавит вас от необходимости постоянно создавать потоки, поскольку ExecutorService объединяет и повторно использует потоки.

0 голосов
/ 09 февраля 2010

Правильный способ сделать что-то подобное - это иметь очередь сообщений , например стандартную J2EE JMS .

В очереди сообщений у вас есть один программный компонент, работа которого заключается в получении сообщений (таких как запросы на шифрование какого-либо ресурса, как в вашем случае), и делает запрос «надежным» транзакционным способом. Затем какой-то независимый процесс опрашивает очередь сообщений на наличие новых сообщений, предпринимает действия с ними и транзакционно помечает сообщения как полученные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...