#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
inFastAPI
фактически создает поток процесса, поэтому разные потоки имеют доступ к одному и тому же пулу переменных (памяти), и хотя нет мьютекса для управления доступом к переменной, общей в обоих потоках, поэтому может случиться так, что доступ к 2 потокампеременнаяax.figure.savefig
, не имеющая права на. Лучшим решением является использование мьютекса, с которым я не знаком, или использованиеmultiprocessing
, которое не использует одну и ту же память