具有重定向打印的GUI中的Python多处理

时间:2013-08-14 18:43:13

标签: python tkinter multiprocessing io-redirection

当使用Process调用在python中执行多处理时,我想在父进程完成每个进程后立即打印一个完成语句,而不是在子工作器函数中。我在Tk GUI中执行此操作,因此sys.stdout被重定向(请参阅下面的简单示例版本)。如果我在worker函数内打印(printLetters - 取消注释掉“#print letter”)我得到错误: “这个过程是分叉的,你不能安全地使用这个CoreFoundation功能。你必须执行()。”

如果有人可以建议一种方法来解决这两个问题中的任何一个(确定何时从父进程更新队列或在sys.stdout重定向的进程内打印),我们将不胜感激。< / p>

...谢谢

import Tkinter
from Tkinter import *
import multiprocessing
import time
from multiprocessing import Process, Queue

class StringVarFile:
    def __init__(self,stringVar,window):
        self.__newline = 0
        self.__stringvar = stringVar
        self.__window = window
    def write(self,s):
        new = self.__stringvar.get()
        for c in s:
            if self.__newline:
                new = ""; self.__newline = 0
            new = new+c
        self.set(new)
    def set(self,s):
        self.__stringvar.set(s); self.__window.update()   
    def get(self):
        return self.__stringvar.get()
    def flush(self): pass

def executeSomething(letters):
    procs=list()
    queue = Queue()
    print 'Begining letter printing...'
    for letter in letters:
        p = Process(target=printLetters, args=(queue,letter))
        procs.append(p)
        p.start()

    for p in procs:
        p.join()
    print 'Finished printing letters'

def printLetters(queue,letter):
    time.sleep(2)
    #print letter
    queue.put(letter)

if __name__ == '__main__':
    root = Tk()
    statusVar = StringVar() ### Class method for Tkinter. Description: "Value holder for strings variables."
    letters = ['a','b','c','d']

    Label(root,width=50,height=10,textvariable=statusVar).pack()
    sys.stdout = StringVarFile(statusVar,root)
    root.after(100, executeSomething(letters))
    root.mainloop()

1 个答案:

答案 0 :(得分:1)

您是否只想打印到GUI?如果是这样,在启动和加入进程之间executeSomething()内,为什么不迭代队列结果?像这样:

for letter in letters:
    print queue.get()