Windows: Как Jupyter генерирует прерывание клавиатуры?

Хотя старый вопрос, но может быть, это может быть полезно кому-то.

Я использую этот способ преобразования строки в int number

var str = "25";       // string
var number = str*1;   // number

Итак, при умножении на 1 , значение не изменяется, но js автоматически возвращает число.

Но, как показано ниже, это следует использовать, если вы уверены, что str является числом (или может быть представлено как число), в противном случае оно вернет NaN - не число.

вы можете создать простую функцию для использования, например

function toNumber(str) {
   return str*1;
}

enter image description here [/g0]

-1
задан user1691278 15 January 2019 в 19:50
поделиться

2 ответа

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

#include <atomic>
#include <signal.h>

::std::atomic<bool> s_interrupted{};

static void signal_handler(int signal)
{
  s_interrupted = true;
}

int main()
{
    ::signal(SIGINT, &::signal_handler);
0
ответ дан VTT 15 January 2019 в 19:50
поделиться

Вы не можете использовать consoleHandler() здесь, потому что нет консоли . Ядро IPython - это «безголовый» дочерний процесс, который выполняет код по запросу, управляемый внешним интерфейсом Jupyter.

Чтобы прервать работающее ядро ​​IPython, интерфейс Jupyter использует сигнал SIGINT. Это делается как на POSIX, так и на Windows; в Windows Jupyter использует дополнительную инфраструктуру, построенную вокруг CreateEventA , SetEvent и WaitForMultipleObjects для достижения того же результата, что и вызов POSIX os.killpg(PID, SIGINT); отдельный поток опрашивает событие и запускает сигнал SIGINT в основном потоке.

Обратите внимание, что ядро ​​IPython явно восстанавливает обработчик сигналов Python по умолчанию для каждого сообщения, которое оно обрабатывает. См. Реализации ipykernel.kernelbase.Kernel для методов pre_ и post_handler_hook :

 self.saved_sigint_handler = signal(SIGINT, default_int_handler)

и

 signal(SIGINT, self.saved_sigint_handler)

Эти два перехвата выполняются до и после каждый обработчик сообщений (то есть для каждое сообщение, отправляемое внешним интерфейсом процессу ядра , включая сообщения выполнения ).

Именно signal.default_int_handler вызывает KeyboardInterrupt в основном потоке Python. Если ваш код должен обнаруживать прерывания, он должен будет регистрировать свой собственный обработчик signal каждый раз, когда IPython запускает ячейку.

В качестве дополнительного примечания: автономный интерактивный интерпретатор Python также не использует SetConsoleCtrlHandler для обнаружения прерываний клавиатуры ; единственное место, которое используется в исходном коде Python, находится в модуле запуска py , и только тогда, чтобы глушить управляющие коды с помощью обработчика, который всегда возвращает TRUE. Вместо этого Python использует Windows, посылающую сигнал SIGINT всем подключенным процессам консоли для активного окна консоли .

0
ответ дан Martijn Pieters 15 January 2019 в 19:50
поделиться
Другие вопросы по тегам:

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