Почему Paramiko зависает, если Вы используете его при загрузке модуля?

Ну, не имеет значения, поворачиваете ли вы массив вокруг правого нижнего угла, верхнего левого угла или любой другой точки: все это просто вращения . Единственный аспект, который имеет большее значение, это направление, в котором вы хотите, чтобы массив вращался по часовой стрелке или против часовой стрелки, и, фактически, вы можете получить один, используя другой: поворот на 90 градусов по часовой стрелке - это то же самое, что поворот на 270 градусов. в противоположном направлении.

Если вы хотите повернуть массив на 90 градусов по часовой стрелке , используйте np.rot90, но скажите numpy, чтобы повернуть массив 3 раза, и, если вы хотите , повернуть массив 90 градусов против часовой стрелки использовать np.rot90, передавая 1 или ничего (кроме массива, конечно):

np.rot90(array)    # 90 deg CCW
np.rot90(array, 1) # 90 deg CCW
np.rot90(array, 3) # 90 deg CW

Пример

import numpy as np

array = np.arange(15).reshape((3, 5))

print(array)

print(np.rot90(array, 1))
print(np.rot90(array, 3))

Исходный массив [ 1110]
array([
    [ 0,  1,  2,  3,  4],
    [ 5,  6,  7,  8,  9],
    [10, 11, 12, 13, 14]
])

Поворот 1 раз (на 90 градусов против часовой стрелки)

array([
    [ 4,  9, 14],
    [ 3,  8, 13],
    [ 2,  7, 12],
    [ 1,  6, 11],
    [ 0,  5, 10]
])

Поворот 3 раза (на 90 градусов по часовой стрелке)

array([
    [10,  5,  0],
    [11,  6,  1],
    [12,  7,  2],
    [13,  8,  3],
    [14,  9,  4]
])
10
задан JimB 22 January 2009 в 15:44
поделиться

1 ответ

Paramiko использует отдельные потоки для базовой передачи. У Вас никогда не должно быть модуля, который порождает поток как побочный эффект импорта. Насколько я понимаю существует единственная доступная блокировка импорта, поэтому когда дочерний поток от Вашего модуля делает попытку другого импорта, это может заблокироваться неограниченно долго, потому что Ваш основной поток все еще содержит блокировку. (Существуют, вероятно, другие глюки, о которых я не знаю также),

В целом модули не должны иметь побочных эффектов никакого вида при импорте, или Вы собираетесь получить непредсказуемые результаты. Просто удержите выполнение с __name__ == '__main__' прием, и Вы будете в порядке.

[РЕДАКТИРОВАНИЕ] я, может казаться, не создаю простой тестовый сценарий, который воспроизводит эту мертвую блокировку. Я все еще предполагаю, что это - проблема поточной обработки с импортом, потому что подлинный код ожидает события, которое никогда не стреляет. Это может быть ошибкой в paramiko или Python, но хорошие новости - то, что Вы никогда не должны видеть его, если Вы делаете вещи правильно ;)

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

18
ответ дан 3 December 2019 в 18:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: