Python с / (многопоточность) c -расширение - обработка SIGINT / Ctrl + C - PullRequest
0 голосов
/ 24 февраля 2020

Я использую расширение c в своем коде python, который предоставляет три функции:

   mycext.setup() # creates multiple c-threads
   try:
      while True:
          sleep(1)
          mycext.dosmth()
   except KeyboardInterrupt:
      print("Keyboard Interrupt, stopping!")
   finally:
      mycext.close()   # joins the c-threads

В коде библиотеки c, я вижу это:

    sigemptyset(&sioset);
    sigaddset(&sioset, SIGIO);
    sigaddset(&sioset, SIGINT);
    sigaddset(&sioset, SIGTERM);

    action.sa_flags = 0;
    pthread_sigmask(SIG_BLOCK, &sioset, NULL);

    sigemptyset(&sioset);
    sigaddset(&sioset, SIGINT);
    pthread_sigmask(SIG_UNBLOCK, &sioset, NULL);

    sigemptyset(&action.sa_mask);
    action.sa_handler = int_handler;
    sigaction(SIGINT, &action, NULL);

    pthread_mutex_init(&read_mmx, NULL);
    pthread_cond_init(&read_cond, NULL);

Теперь, когда я нажимаю Ctrl + c, потоки, созданные расширением c, закрываются, а затем все зависает, пока я не использую SIGKILL.

Я понимаю, что каким-то образом расширение c обрабатывает SIGINT и никогда не находит путь к интерпретатору python, что означает, что KeyboardInterrupt не зарегистрировано. Мой вопрос был бы: нужно ли расширению c каким-то образом передавать сигнал (например, вызывая PyErr_SetInterrupt() даже если я понимаю, что в этом нет необходимости) или не стоит с ним справиться?

РЕДАКТИРОВАТЬ 1 : Хорошо, я думаю, что расширение c не должно использовать sigaction для установки нового обработчика, поскольку оно будет перезаписывать все, что python поместит туда изначально ... правильный? Какой лучший способ справиться с ситуацией?

...