0

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

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

谢谢...

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()
4

1 回答 1

1

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

for letter in letters:
    print queue.get()
于 2013-08-14T19:52:25.667 回答