У меня есть любопытная проблема, и я надеюсь, что кто-нибудь сможет пролить свет на нее.
У меня есть сложный фрагмент кода, который начинался как каталог, полный скриптов, который я решил переработать в пакет. Это изменение кода, по-видимому, послужило причиной появления странных тупиковых ситуаций.
Ниже представлена попытка канонического воспроизведения проблемы; что не удается, в том смысле, что этот код работает, как ожидалось. Фактическое воспроизведение проблемы может потребовать большого количества кода; но я не могу на всю жизнь представить, что отличается от фрагмента кода оскорбления в контексте.
import numpy as np
from scipy.sparse import csr_matrix
from threading import Thread
def dummy():
print 'this is printed'
I = np.eye(3)
print 'all is still fine'
csr_matrix(I)
print 'this is never printed; csr_matrix appears to be a trigger for deadlock'
print np.ones(4)
print 'same problem; somehow, printing ndarrays is no longer cool either'
thr = Thread(target=dummy)
thr.start()
Возможно, этот краткий комментарий в документации связан? Я не уверен, что полностью понимаю то, что здесь говорится
http://docs.python.org/2/library/threading#importing-in-threaded-code
Во-первых, кроме основного модуля, импорт не должен иметь побочного эффекта в виде создания нового потока и последующего ожидания этого потока каким-либо образом. Несоблюдение этого ограничения может привести к тупиковой ситуации, если порожденный поток прямо или косвенно попытается импортировать модуль.
Некоторый контекст: я использую python 2.7, numpy 1.8, где я пытаюсь создать этот новый поток из потока mayavi / traitsui (который я не понимаю, почему он должен быть актуальным и который работал нормально до структуры пакета, но хорошо) . Кроме того, в моем порожденном потоке есть масса кода numpy / scipy, который отлично работает; это просто печать ndarrays и создание разреженных матриц, которые до сих пор оказались триггерами для тупиковой ситуации.
Я подозреваю какое-то фанковое взаимодействие с mayavi, поскольку закрытие окна mayavi заставляет все заблокированные потоки снова запускаться. Возможно, этот конкретный оператор запускает поток Python, чтобы уступить потоку Mayavi, но они каким-то образом не могут снова получить фокус?
Мы очень ценим любые подсказки, которые приведут к дальнейшему сужению этой тайны!
join()
ведете какие-либо из этих тем? Вы запускаете их на верхнем уровне модуля, как в примере, который вы нам дали? Если вы делаете обе эти вещи, то это то, что вам не следует делать в комментарии из документации. Существует глобальная блокировка импорта, которая удерживается во время выполнения кода модуля. Вызовcsr_matrix()
таким образом вызывает импорт, поэтому он также попытается получить блокировку импорта. Возникает тупик. Не делай этого. - person Robert Kern   schedule 16.12.2013csr_matrix()
на плотномndarray
вызове импорта. Если вы можете предложить полный пример, демонстрирующий проблему, я могу помочь. - person Robert Kern   schedule 17.12.2013mlab.show()
в своем скрипте, а не интегрируете свой код в приложение Mayavi? - person Robert Kern   schedule 17.12.2013