Проблема с параллелизмом при использовании Python threading.Thread-модуль и функция ключевого слушателя - PullRequest
0 голосов
/ 10 мая 2019

Я работаю над простым приложением викторины, которое работает в REPL. Я хотел бы, чтобы специальная ключевая команда вручную выдвигала вопросы после того, как пользователь дал ответ. Я использую функцию для прослушивания ввода с клавиатуры для определенного нажатия клавиши, и я пытаюсь запустить эту функцию в потоке, но, как я ее настроил, поток не вернет управление основному потоку до тех пор, пока это не будет выполнено. Как я могу заставить его слушать, пока пользователь взаимодействует с приложением, печатать ответы на вопрос и затем отвечать при нажатии специальной клавиши? Любое руководство будет с благодарностью!

import os
import sys
import tty
import time
import termios
import threading


def getch():
    '''detects a key press
    '''
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setraw(sys.stdin.fileno())
        ch = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return ch


def session(topic, limit):
    question = (index for index in range(1, limit + 1))

    while True:
        key = getch()

        if key == 'q':
          print('\n\tSession Complete.')
          break

        elif key == 'n':
            try:
               topic.get_question(next(question))
               time.sleep(0.2)
            except (StopIteration, IndexError):
               print('\n\tNo More Questions in the Queue.')
               break



session_thread = threading.Thread(target=session, args=(topic, limit))
sesion_thread.start()

...