Я иногда использую это поведение как альтернативу следующему шаблону:
singleton = None
def use_singleton():
global singleton
if singleton is None:
singleton = _make_singleton()
return singleton.use_me()
Если singleton
используется только use_singleton
, мне нравится следующий шаблон в качестве замены:
# _make_singleton() is called only once when the def is executed
def use_singleton(singleton=_make_singleton()):
return singleton.use_me()
Я использовал это для создания экземпляров клиентских классов, которые обращаются к внешним ресурсам, а также для создания dicts или списков для memoization.
Поскольку я не думаю, что этот шаблон хорошо известен, Я поставил короткий комментарий для защиты от будущих недоразумений.
Ты ничего плохого не делаешь. Memcheck ложные срабатывания с valgrind являются общими, лучшее, что вы можете сделать, это подавить их.
Эта страница руководства больше говорит об этих ложных срабатываниях. Цитата ближе к концу:
Обертки должны уменьшить частоту ошибочных ошибок Memcheck в приложениях MPI. Поскольку перенос выполняется на интерфейсе MPI, по-прежнему потенциально может быть большое количество ошибок, сообщаемых в реализации MPI ниже интерфейса. Лучшее, что вы можете сделать, это попытаться их подавить.
blockquote>
Часто задаваемые вопросы OpenMPI затрагивают эту проблему: http://www.open-mpi.org/faq/?category=debugging#valgrind_clean
Есть много ситуации, когда Open MPI целенаправленно не инициализирует и впоследствии не связывает память, например, путем вызова writev. Кроме того, известно несколько случаев, когда память не была должным образом освобождена при MPI_Finalize.
Это, конечно, не помогает отличить реальные ошибки от ложных срабатываний. Valgrind предоставляет функции для подавления ошибок и предупреждений из определенных контекстов функций.
В попытке облегчить отладку с помощью Valgrind, начиная с версии 1.5, Open MPI предоставляет так называемый файл подавления Valgrind, который может быть передается в командной строке:
blockquote>mpirun -np 2 valgrind --suppressions=$PREFIX/share/openmpi/openmpi-valgrind.supp