2008-11-12 1 views
2

В моей программе Java я создаю OtpNode и «named» OtpMBox. Всякий раз, когда сообщение принимается через этот mbox, необходимо выполнить некоторую трудоемкую операцию, после которой отправляется ответное сообщение. Поскольку эта операция требует много времени, последующие сообщения, отправленные в mbox, не будут обрабатываться немедленно.Erlang JInterface - это OtpMBox поточно-безопасный?

Итак, я хочу использовать потоки Java - по одному на полученное сообщение. Мой вопрос в том, должен ли я также создать новый OtpMBox для каждого полученного сообщения или может ли исходный OtpMBox делиться среди всех потоков?

ответ

0

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

Лучше сделайте java-thread 'supervisor', который запустит некоторые (может быть количество процессоров), количество «рабочих» java-потоков с OtpMBox и отправьте отрывки OtpMBox на erlang система.

--sorry мой английский

0

Это звучит, как вы пытаетесь использовать Java, чтобы делать то, что Эрл это хорошо. Безопасная легкая многопроцессорная обработка. Есть ли причина, по которой вам нужно использовать java для обработки, можно ли это сделать в erlang? Или, наоборот, почему вы используете erlang, если java будет делать потоки в любом случае. Я думаю, что, возможно, больше информации было бы полезно при ответе на этот вопрос.

1

Я не уверен, что я понимаю вопрос. Вы хотите, чтобы OtpMBox для каждого потока мог отправлять ответ, или эта долговременная операция должна иметь возможность получать дальнейшие сообщения?

Если первое, вы можете повторно использовать оригинальную mbox. Операция отправки синхронизируется.

Если последнее, было бы лучше сделать путь Erlang, создав mbox для каждого потока и позволяя вызывающему абоненту со стороны erlang знать о его pid, чтобы он мог отправлять данные в эту mbox. Это связано с тем, что у jinterface нет selctive receive, и сообщения будут попадать в любой поток, который просыпается первым.

2

Вы можете поделиться объектом OtpMBox и использовать его из нескольких потоков. В этом erlang-questions thread about jinterface threadsafety обсуждается вопрос.

Кроме того, для конкретных конкретных вопросов Java вы, вероятно, захотите использовать ThreadPoolExecutor from java.util.concurrent для обработки поступающих сообщений.

+0

Хорошо, но как определить, какой ответ подходит к какой теме? – Rekin 2010-10-27 07:31:38