Какой забавный вопрос ... как вы заметили, вы не сможете позволить себе накладные расходы, связанные с традиционной блокировкой для рабочей очереди для этого. Я бы посоветовал вам попробовать использовать одну из существующих сред детального программирования задач, если вы можете ... Я думаю об этом в трех пакетах работы:
Первая часть проблемы заключается в обеспечении безопасности, правильности и распараллеливания, и похоже, что вы это рассмотрели, потому что ваша функция чиста.
Я думаю, что следующая самая сложная часть - это описание параллелизма, в частности, вы упоминаете, что эта функция вызывается много раз. Можете ли вы передать это и отделить планирование функции от ее работы? Если вы не можете передать это по конвейеру, это похоже на параллельный цикл, обход дерева или оно более неструктурировано, чем это. В частности, подчиняется Amdahl , если вы не можете перекрыть работу и убедиться, что одновременно запущено несколько экземпляров или что-то еще, вы фактически последовательны, даже если вы чисты. Все, что вы можете сделать, чтобы реорганизовать работу в конвейер, рекурсивный обход дерева (или параллельный цикл) или, если вам нужно более неструктурированную работу с зависимостями explicity между задачами, здесь поможет независимо от используемой библиотеки.
Последняя область, о которой я думаю, - это обеспечение эффективного выполнения на вашей платформе, что включает в себя снижение накладных расходов и конфликтов в вашем коде и коде планирования и обеспечение того, чтобы любой последовательный код был абсолютно максимально эффективным. Если вы не можете использовать одну из существующих библиотек и должны создать свою собственную, я бы посоветовал вам взглянуть на очередь для кражи работы и алгоритмы планирования с самостоятельным управлением, поскольку вы заметили, что выиграли » Вы не сможете увидеть выгоды от использования традиционных блокировок, потому что их стоимость перевешивает ваши функциональные затраты, и вам, скорее всего, придется взглянуть на методы без блокировок, чтобы уменьшить стоимость планирования и удаления задачи в любую очередь, которую вы используете. Вам также нужно будет уделять большое внимание совместному использованию и конфликтам как в рамках вашего алгоритма планирования, так и в вашей функции, потому что на этом уровне детализации, в дополнение к обычным ошибкам прогнозирования ветвлений и пропускной способности команд, вам также необходимо искать в общее состояние и конфликты даже при чтениях, поскольку они также могут быть источниками конфликтов .
Извините, если это не было супер конкретным, но я надеюсь, что это было полезно.