безопасность pandas и numpy

Я использую pandas на веб-сервере (apache + modwsgi + django) и имею жесткую ошибку, которую я обнаружил, вызван тем, что панды не являются потокобезопасными.

После большого сокращения кода я наконец нашел короткую автономную программу, которая может быть использована для воспроизведения проблемы. Вы можете видеть это ниже.

  • Импорт молча убивает нить
  • thread.start_new_thread vs threading.Thread.start
  • PyQT и потоки
  • Управление приоритетом планирования потоков python?
  • Можно ли параллельно просматривать рамки веб-камеры?
  • Замораживание программы во время выполнения функции в Tkinter
  • Дело в том, что, вопреки ответу на этот вопрос, этот пример показывает, что панды могут сбой даже при очень простых операциях, которые не изменяют фрейм данных. Я не могу представить, как этот простой фрагмент кода может быть небезопасным с потоками …

    Речь идет об использовании pandas и numpy на веб-сервере. Является ли это возможным? Как я могу исправить свой код с помощью панд? (пример использования блокировки был бы полезен)

    Вот код, который вызывает ошибку сегментации:

     import threading import pandas as pd import numpy as np def let_crash(crash=True): t = 0.02 * np.arange(100000) # ok con 10000 data = pd.DataFrame({'t': t}) if crash: data['t'] * 1.5 # CRASH else: data['t'].values * 1.5 # THIS IS OK! if __name__ == '__main__': threads = [] for i in range(100): if True: # asynchronous t = threading.Thread(target=let_crash, args = ()) t.daemon = True t.start() threads.append(t) else: # synchronous let_crash() for t in threads: t.join() 

    Моя среда: python 2.7.3, numpy 1.8.0, pandas 0.13.1

  • Невозможно импортировать cv2; Msgstr "Ошибка загрузки DLL"
  • Как получить индекс максимального элемента в массиве numpy вдоль одной оси
  • Разрыв раунда с numpy
  • Анализ основных компонентов в Python
  • Scipy odeint дает предупреждение lsoda
  • Получать пересекающиеся строки по двум массивам 2D numpy
  • 2 Solutions collect form web for “безопасность pandas и numpy”

    см. оговорку в документах: http://pandas.pydata.org/pandas-docs/dev/gotchas.html#thread-safety

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

    Копия является основой операций pandas (поскольку большинство операций генерируют новый объект для возврата пользователю)

    Это не тривиально исправить это и будет иметь довольно тяжелую стоимость перфоманса, поэтому потребуется немного работы, чтобы справиться с этим должным образом.

    Проще всего просто не обмениваться объектами по потокам или не блокировать их при использовании.

    Настройте mod_wsgi для запуска в режиме одного потока.

     WSGIDaemonProcess mysite processes=5 threads=1 WSGIProcessGroup mysite WSGIApplicationGroup %{GLOBAL} 

    В этом случае он использует режим демонов mod_wsgi, чтобы процессы / потоки могли быть установлены независимо на любом используемом Apache MPM.

    Python - лучший язык программирования в мире.