Неблокирующее перенаправление вывода из многопроцессорного процесса - PullRequest
0 голосов
/ 18 августа 2011

Вчера я задал вопрос о проблеме с программой, которую я пишу на Python ( Передача объектов wxPython в качестве многопроцессорных аргументов ).Мне удалось решить эту проблему, используя многопроцессорный процесс для функции, которая оценивает сценарии.Однако, поскольку сценарии запускаются из другого процесса, их вывод неправильно перенаправляется в мое окно wxPython TextCtrl.Итак, я ищу способ непрерывного перенаправления вывода из дочернего процесса в мой основной процесс, чтобы его можно было записать в мое текстовое окно.

Это функция, которая устанавливает процесс:

def createprocess(test):
    q = Queue()
    q.put(test)
    p = Process(target=runtest, args=(q,))
    p.start()
    p.join()
    return q.get()

Это целевая функция процесса:

def runtest(q):
    test = q.get()
    exec 'import ' + test
    func=test+'.'+test+'()'
    ret = eval(func)
    q.put(ret)

Я нашел этот поток ( Как я могу отправить вывод многопроцессорного процесса Python в графический интерфейс Tkinter ), который описывает, какперенаправить вывод из дочернего процесса, но проблема заключалась в том, что вывод был получен после завершения оценки.

1 Ответ

1 голос
/ 18 августа 2011

Решением вашей непосредственной проблемы является использование двух Queue.Queue вместо одного. Давайте назовем их inqueue и outqueue. Тогда

def runtest(inqueue,outqueue):
    test = inqueue.get()
    module=__import__(test)
    ret=getattr(module,test)()    
    outqueue.put(ret)

Большая проблема связана с тем, как управлять элементами графического интерфейса, такими как TextCtrl, с выводом из отдельного процесса. Ответ - нет. Вместо этого порождают поток (который может, если вам нравится, порождать другие процессы), который может получать значения из outqueue и (в отличие от отдельных процессов) обновлять TextCtrl. В вики LongRunningTasks приведены примеры того, как это настроить.

...