Erlang JInterface - является ли OtpMBox поточно-ориентированным? - PullRequest
2 голосов
/ 12 ноября 2008

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

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

Ответы [ 4 ]

2 голосов
/ 21 июля 2009

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

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

1 голос
/ 20 июля 2009

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

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

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

0 голосов
/ 01 апреля 2009

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

0 голосов
/ 06 марта 2009

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

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

- извините, мой английский

...