Команда, которую вы отправили в своем вопросе, работает для меня при копировании файла из виртуальной машины Google Compute Engine на мой локальный компьютер.
$ gcloud compute scp vm1:~/.bashrc ~/Documents/
.bashrc 100% 3515 3.4KB/s 00:00
Я также попытался сделать копию с другой стороны (т.е. с моей локальной машины на виртуальную машину GCE), и она работает:
$ gcloud compute scp ~/Documents/.bashrc vm1:~/temp/
.bashrc 100% 3515 3.4KB/s 00:00
$ gcloud compute scp ~/Documents/.bashrc vm1:~/.bashrc-new
.bashrc 100% 3515 3.4KB/s 00:00
gcloud
опирается на исполняемый файл scp
, присутствующий в ваш PATH
. Аргументы, которые вы передаете команде gcloud scp
, передаются в двоичный файл scp
. Предполагая, что ваши исходный и целевой путь верны, он должен работать.
scp
Однако, исходя из вашего конкретного сообщения об ошибке, я видел, что этот вариант появляется только тогда, когда исходный путь, из которого вы пытаетесь копировать, является каталогом, а не файлом. Для этого конкретного случая вы можете передать аргумент --recurse
(аналогично аргументу -r
, поддерживаемому обычным scp
), который будет рекурсивно копировать все файлы и каталоги в указанном каталоге.
gcloud compute scp --recurse SRC_PATH DEST_PATH
Как вы сказали, из-за GIL это невозможно в рамках одного процесса.
Я рекомендую запустить второй процесс мониторинга, который в течение жизни слушает биения другого потока в исходном приложении. Если этот временной интервал отсутствует в течение определенного периода времени, монитор может остановить ваше приложение и перезапустить его.
Если бы вы предлагали, поскольку у вас есть контроль над фреймворком, отключить все плагины, кроме одного, и посмотреть. В основном, если у вас есть плагины P1, P2 ... Pn запустите процесс N и отключите P1 вначале, P2 во втором и так далее
, это будет намного быстрее по сравнению с многопоточным запуском, так как GIL-блокировка отсутствует, и вы быстрее узнаете, какой плагин является виновником.
Очевидно, вам не нужна многопоточность, только параллелизм, потому что ваши потоки не имеют общего состояния:
Попробуйте многопроцессорность вместо многопоточности
Однопоточные / N подпроцессов. Здесь вы можете рассчитать время для каждого запроса, поскольку GIL не удерживается.
Другая возможность - избавиться от нескольких потоков выполнения и использовать сетевое программирование на основе событий (т.е. использовать витую версию)
Я бы еще посмотрел на предложение носкло. Вы можете профилировать в одном потоке, чтобы найти элемент, и получить дамп на очень долгом этапе, чтобы, возможно, увидеть виновника. Да, я знаю, что это 20 000 элементов, и это займет много времени, но иногда нужно просто уснуть и найти чертову штуку, чтобы убедить себя, что проблема обнаружена и решена. Запустите сценарий и займитесь чем-нибудь еще конструктивным. Вернитесь и проанализируйте результаты. Это то, что иногда отличает мужчин от мальчиков; -)
Или / И добавьте информацию журнала, которая отслеживает время выполнения каждого элемента, поскольку оно обрабатывается каждым плагином. Посмотрите на данные журнала в конце выполняемой программы и посмотрите, выполнение какой из них заняло ужасно много времени по сравнению с другими.