Python многопроцессорные общие переменные - PullRequest
0 голосов
/ 28 февраля 2020

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

Я вижу, что возможно использовать multiprocessing.Manager, но я использую concurrent.futures.ThreadPoolExecutor. там есть подобная функция?

Я написал код ниже, чтобы уточнить. Фактический код имеет функцию setState для настройки состояния записи и тому подобное, и нажатая клавиша не передается. Кроме того, фактический код, очевидно, имеет прослушиватель нажатий клавиш и движений мыши, функции getKey и getMove должны быть теми, которые добавляются в список. Проблема в этом случае состоит в том, что переменная записи не может быть доступна из второго процесса, который должен начинать движение записи после нажатия клавиши «Вставить». Функция в параллельном режиме, похожая на Manager в многопроцессорной среде, решит эту проблему, но я не уверен, как она называется или как ее использовать.

from concurrent.futures import ThreadPoolExecutor as Executor
import time

class recMacros(object):
    def __init__(self):
        self.recording = False

        self.lastKey = None
        self.lastMove = None

        self.mouseMoves = []
        self.keyPresses = []

        self.runMacros()


    def getTime(self):
        return time.time()

    def getKey(self):
        #return keyboard listener last key pressed
        return "W"

    def getMove(self):
        #return keyboard listener last key pressed
        return "W"

    def recMoves(self): 
        while True:
            while self.recording:
                mouseMove = self.getMove()
                if mouseMove != self.lastMove:
                    self.mouseMoves.append((mouseMove, self.getTime()))
                    self.lastMove = mouseMove

    def recPresses(self):
         while True:
             keyPress = self.getKey()
             if keyPress == "Insert":
                self.recording = True
             elif keyPress == "End":
                self.recording = False
             elif self.recording and keyPress != self.lastKey:
                self.keyPresses.append((keyPress, self.getTime()))
                self.lastKey = keyPress
             else:
                 print("Error")

    def recMacros(self):
        with Executor(max_workers=2) as e:
            e.submit(recPresses)
            e.submit(recMoves)

if __name__ == "__main__":
     recMacros()

Буду признателен за быстрое руководство, поскольку я в RU sh. Заранее спасибо

@ user2357112 поддерживает Monica. Вот код, который я использовал для проверки синхронизации, чтобы убедиться, что ThreadPoolExecutor похож на процесс для параллельного запуска функций:

from concurrent.futures import ThreadPoolExecutor
import time

def printTime():
    print(f"Time: {time.time()}\n")


def runPro():
    with ThreadPoolExecutor(max_workers=3) as e:
        for i in range(3):
            e.submit(printTime)


runPro()

1 Ответ

0 голосов
/ 28 февраля 2020

Если вы хотите сохранить что-то в переменной, которую может использовать каждый процесс, вы можете использовать queue .

  1. Import queue
import queue
Создать общую переменную
shared_var = queue.Queue(maxsize=0)

, где maxsize - максимум, который можно сохранить в этой очереди

Редактирование общей переменной в любом процессе
shared_var.put(item)
Получить вещи в переменной
variable = shared_var.get()

С помощью queue можно сделать гораздо больше, см. Документацию .

...