Я писал программу, которая много раз разветвляется, и каждая из разветвлений может также разбиваться на более мелкие части.
Каждый из нижестоящих дочерних элементов в конечном счете выполняет сложный расчет и выводит результаты в, как я надеюсь, файле с уникальным именем.
Идентификаторы должны быть уникальными, чтобы после завершения всех дочерних элементов родитель мог пожинать дочерние элементы и затем собирать данные.
В качестве примера, который поможет сделать это более конкретным, каждый из дочерних элементов создаст файл $unique_id.storable
, содержащий данные, обработанные соответствующим дочерним элементом.
Когда родитель обнаруживает, что все дочерние элементы завершены, он использует Storable для считывания файлов обратно в хеш и использует, как мы надеемся, уникальный $unique_id
в качестве ключа.
Проблема возникает, когда два ребенка появляются почти одновременно. Прямо сейчас каждый из этих дочерних элементов запускает свой собственный независимый счетчик, так что несколько дочерних элементов могут создать одноименное имя $unique_id
, даже если данные в этих файлах действительно уникальны.
Как я могу разделить переменную счетчика, простой скаляр, между вилками?
Я понимаю, что вопросы межпроцессного взаимодействия довольно часто встречаются в сетях, но я замечаю, что многие решения касаются общей проблемы распределения произвольных объемов данных между процессами. Мне просто нужно поделиться одним скаляром, поэтому я задаюсь вопросом, можно ли решить мою проблему более простым способом. В идеале, в идеале, на самом деле, я бы предпочел решение, не включающее «нестандартный» модуль. Я вижу, что IPC::Shareable
иногда рекомендуется, но мне интересно, может ли это быть излишним для моей проблемы, и в любом случае это один из тех "нестандартных" модулей.
Будет ли разумно, если я сделаю свой $unique_id
PID? Возможно ли, что родительская программа, работающая в течение, скажем, одной недели на интенсивно используемой машине, могла бы повторно использовать PID и не гарантировать уникальность?
Буду признателен за любые советы, которые люди могут дать.