Erlang JInterface - является ли OtpMBox поточно-ориентированным?
В моей Java-программе я создаю OtpNode и "названный" OtpMBox. Всякий раз, когда сообщение принимается через этот mbox, необходимо выполнить некоторую трудоемкую операцию, после чего ответное сообщение отправляется обратно. Поскольку эта операция занимает много времени, последующие сообщения, отправленные на mbox, не будут обработаны немедленно.
Поэтому я хочу использовать потоки Java - по одному на каждое полученное сообщение. Мой вопрос заключается в том, должен ли я также создавать новый OtpMBox для каждого полученного сообщения, или можно ли использовать оригинальный OtpMBox для всех потоков?
4 ответа
Вы можете поделиться объектом OtpMBox и использовать его из нескольких потоков. Эта ветка erlang-questions о безопасности нитей jinterface обсуждает этот вопрос.
Кроме того, для чисто специфических вопросов Java вы, вероятно, захотите использовать ThreadPoolExecutor из java.util.concurrent для обработки поступающих сообщений.
Я не уверен, что понимаю вопрос. Вы хотели бы, чтобы OtpMBox для каждого потока просто мог отправлять ответ, или эта длительная операция должна быть в состоянии получать дополнительные сообщения?
Если первое, вы можете повторно использовать оригинальный mbox. Операция отправки синхронизирована.
Если последнее, было бы лучше сделать это способом Erlang, создав mbox для каждого потока и сообщив вызывающей стороне со стороны erlang о его pid, чтобы он мог отправлять данные в этот mbox. Это потому, что у jinterface нет селективного приема, и сообщения будут попадать в любой поток, который просыпается первым.
Похоже, вы пытаетесь использовать Java, чтобы делать то, в чем хорош Erlang. Безопасная легкая многопроцессорная обработка. Есть ли причина, по которой вам нужно использовать java для обработки, может ли она быть выполнена в erlang? Или просто почему вы используете erlang, если Java все равно будет создавать потоки. Я думаю, что, возможно, больше информации было бы полезно для ответа на этот вопрос.
Я не очень знаком с этим материалом, но я полагаю, что вы можете выполнить некоторые вычисления) У вас есть накладные расходы на запуск OtpMBox для каждого потока Java и издержки на управляющую систему (написанную на Java), которая заставляет разные потоки выполнять некоторую работу и взять результаты от них. Я считаю, что Java не является хорошим инструментом для этого)
Лучше создать java-поток 'supervisor', который запустит некоторые (может быть количество процессоров) количество рабочих java-потоков с помощью OtpMBox и отправит pids OtpMBox в систему erlang.
--Извините мой английский