Конечно, это возможно.Фактически, я думаю, что простая однопоточная реализация должна работать просто отлично, предполагая, что допустимо, чтобы некоторые избыточные вычисления могли выполняться в случае, когда одна и та же функция вызывается с одинаковыми параметрами параллельно.
Для иллюстрации сценария ваша процедура запоминания, вероятно, будет выглядеть примерно так:
if args not in cache:
cache[args] = func(args)
return cache[args]
Если два потока попадают в это место одновременно с одним и тем же args
, они оба могут вызвать func(args)
параллельно, в то время как было бы более эффективно вызывать только один экземпляр вычисления, а другой - ждать завершения первого.Это не может быть слишком большой проблемой для вас.Если это так, решение с использованием блокировок (из модуля threading
) для блокировки потоков с совпадающими аргументами должно быть довольно простым.