файл сохранения matplotlib, вызывающий нарушение сегментации

#python #python-3.x #matplotlib #segmentation-fault #save

#python #python-3.x #matplotlib #ошибка сегментации #Сохранить

Вопрос:

Я пытаюсь отобразить некоторые данные с помощью matplotlib

  def _draw_plot(self, iou_values: np.array, parameters, title: str, file_path: str) -> None:
        fig, ax = plt.subplots(num=3, figsize=(16, 9), dpi=360, facecolor='w', edgecolor='k')

        ax.hist(x=iou_values, bins=all_bins[0], facecolor="#FF0000", alpha=0.5, label="Bad IoU", linewidth=1,
                 edgecolor='black')

        ax.set_xticks(np.arange(0, 1.1, step=0.1))
        ax.set_xlim(0, 1)

        ax.figure.savefig(file_path, bbox_inches='tight', format='png')
        plt.clf()
 

этот код вызывается конечной точкой API. когда к этой конечной точке одновременно поступает несколько запросов, я получаю эту ошибку

 Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
 

и программа прекращает выполнение.
Проблема в этой строке

         ax.figure.savefig(file_path, bbox_inches='tight', format='png')
 

потому что, когда я пытаюсь прокомментировать эту строку, проблема не появляется

Есть ли какое-либо решение этой проблемы?

Комментарии:

1. возможно, вы пытаетесь выполнить запись в один и тот же файл одновременно из нескольких процессов? Вы должны убедиться, что каждый экземпляр выполняет запись в другой file_path или дождаться завершения предыдущего процесса

2. нет, каждый раз, когда вызывается эта функция, ей предоставляется уникальный путь вывода. Более того, я не могу дождаться завершения другого процесса, потому что API запускает фоновую задачу, и если я ее изменю, пользователю придется долго ждать завершения обработки, что неудобно.

3. хорошо, хорошо, приведенный вами код должен работать нормально; для тех, кто поможет диагностировать вашу проблему, вам нужно будет предоставить более подробную информацию о том, как вызывается функция из API

4. после некоторой отладки и чтения некоторой документации я обнаружил, что BackgroundTasks in FastAPI фактически создает поток процесса, поэтому разные потоки имеют доступ к одному и тому же пулу переменных (памяти), и хотя нет мьютекса для управления доступом к переменной, общей в обоих потоках, поэтому может случиться так, что доступ к 2 потокампеременная ax.figure.savefig , не имеющая права на. Лучшим решением является использование мьютекса, с которым я не знаком, или использование multiprocessing , которое не использует одну и ту же память