Как изменить переменную класса в отдельном запущенном процессе? - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь написать метод класса Python, который выполняется в течение фиксированного периода времени, и при необходимости изменить переменную экземпляра класса во время выполнения.Для моего проекта мне нужен метод read_key в следующем коде, чтобы он работал ровно 5 секунд (не больше, не меньше).

В течение этих 5 секунд я использую getch.getch(), чтобы попытаться прочитать один символ с клавиатуры и назначить его переменной экземпляра self.key.Потому что getch.getch() будет блокировать выполнение своего процесса, пока не будет обнаружено нажатие клавиши.Если пользователь не нажимает никакую клавишу в этом 5-секундном окне, пусть self.key будет None.

Пока что я могу думать только об использовании multiprocessing и join() для его реализации.5 секундный эффект «таймера».

import getch
import multiprocessing

class A:

    def __init__(self):
        self.key = None
        self.read_key()

        # to check whether instance variable is successfully modified
        print(self.key)     

    def read_key(self):
        def scan():
            self.key = None
            while True:     
                key = getch.getch()
                if key == 'a':
                    self.key = key
                    print('updated self key to ' + str(self.key))
                else:
                    print('invalid entry ' + str(key))
        p = multiprocessing.Process(target=scan)
        p.start()
        p.join(5)
        p.terminate()


if __name__ == '__main__':
    A()

Запуск приведенного выше кода занимает 5 секунд.Если пользователь нажимает клавишу a после запуска программы, я ожидаю, что распечатка будет:

'updated self key to a'
'a'

То, что я на самом деле вижу:

'updated self key to a'
None

Видимо, дажехотя self.key = key выполняется, фактическая переменная экземпляра self.key.Любая идея, почему и как изменить self.key, если пользователь нажимает клавишу a ?

1 Ответ

0 голосов
/ 01 января 2019

Мне удалось найти следующее решение, используя общую переменную multiprocessing.Используя общую переменную detected, я могу определить, нажал ли пользователь какую-либо из специальных клавиш, которые я хотел бы обнаружить.Затем я вручную устанавливаю переменную экземпляра класса в конце метода, чтобы добиться эффекта установки атрибута self.key ровно за 5 секунд.

https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Value

def read_key(self):
    def scan(detected):
        while True:
            key = getch.getch()
            if key == 'a':
                detected.value = b'a'
            elif key == 'd':
                detected.value = b'd'
            elif key == 'w':
                detected.value = b'w'
            elif key == 's':
                detected.value = b's'

    detected = Value('c', b'z')
    p = Process(target=scan, args=(detected,))
    p.start()
    p.join(self.time_interval)
    p.terminate()
    byte_str_map = {b'a': 'a',
                    b's': 's',
                    b'w': 'w',
                    b'd': 'd'}
    self.key = byte_str_map.get(detected.value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...