Во-первых, я очень новичок в Elixir, так что это может быть ошибочный вопросСохранять родительский процесс
У меня есть функция, которая запускает два процесса.
Первый процесс использует библиотеку erlang: fs для просмотра каталога изменений файла, а затем отправляет сообщение во второй процесс.
Второй процесс ожидает сообщения о том, что файл в каталоге был изменен, и когда он получает сообщение, запускает функцию, которая регенерирует отчет HTML (это счет-фактура).
Это выглядит следующим образом:
def run_report_daemon(line_item_dir) do
if Process.whereis(:html_daemon) == nil do
spawn(HTMLInvoiceDaemon, :run_daemon, [line_item_dir])
|> Process.register(:html_daemon)
end
if Process.whereis(:file_watcher) == nil do
:fs.start_link(:file_watcher, Path.absname(line_item_dir))
end
Process.sleep(1000)
run_report_daemon(line_item_dir)
end
Этот «работает», но то, что меня беспокоит, это «сон» и рекурсивный вызов.
Мой вопрос: есть ли лучший способ сохранить процесс, содержащий функцию, которая запускает мои процессы. Без рекурсивного вызова и сна он просто умирает и принимает с собой другие процессы. С рекурсивным вызовом и без сна он потребляет огромную часть ресурсов процессора, потому что он очень быстро зацикливается.
Блоки if необходимы, поскольку в противном случае он будет повторно запускать и регистрировать процессы.
Я думал об использовании диспетчера, но тогда я не уверен, как запустить процесс: fs под диспетчером, и даже в этом случае мне нужно сохранить начальный процесс в живых.
Я подозреваю, что моя проблема связана с фундаментальным непониманием «правильного способа сделать что-то» в Эликсире.
(примечание: я, вероятно, может сделать все это без порождения процессов, как это, но это обучение упражнения)
Где именно вы отправляете сообщения на 'HTMLInvoiceDaemon'? Можете ли вы опубликовать еще какой-нибудь код? – Dogbert
[: fs library] (https://github.com/synrc/fs) включает функцию, которая позволяет другому процессу подписываться на получение сообщений из процесса: fs. В HTMLInvoiceDaemon я подписываюсь на сообщения от: file_watcher, а затем выполняю эти сообщения. – Veen
Действительно ли 'line_item_dir' или вы знаете это во время начала? Кроме того, сколько из них есть? Я попытался ответить, но потом понял, что вход там будет трудно получить, если неизвестно, когда приложение запустится. –