当使用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()
答案 0 :(得分:1)
您是否只想打印到GUI?如果是这样,在启动和加入进程之间executeSomething()
内,为什么不迭代队列结果?像这样:
for letter in letters:
print queue.get()