如何重定向多处理池函数

2024-10-04 05:24:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个tkinter文本小部件并希望重定向系统标准输出到文本小部件。我部分地实现了这个功能,但我面临多处理的问题。在

下面是一个你可以玩的python3玩具

import sys
import tkinter as tk
from multiprocessing import Pool

root = tk.Tk()
root.geometry('600x400+30+30')

textArea = tk.Text(root, bg='gray', width=70, height=20)
textArea.pack()
tk.Button(root, text='click me', command=lambda: print('Dont touch\n me!')).pack()

class redirectStd():
    def __init__(self, textWidget):
        self.textBoard = textWidget
        self.flush = sys.stdout.flush
    def write(self, msg):
        self.textBoard.insert('end', msg)

sys.stdout = redirectStd(textArea)
sys.stderr = redirectStd(textArea)

def f(x):
    print('calculate:', x, '** 2')
    return x ** 2

def testParallel():
    print('start testing')
    with Pool(processes=2) as p:
        res = p.map(f, [1, 4, 0, 7, 3, 5])
        print(res)

tk.Button(root, text='test multiprocessing', command=testParallel).pack()

root.mainloop()

这将正常运行。但是,def f(x)中的打印不会打印文本小部件中的任何内容。在

如果class redirectStd块中的注释self.flush = sys.stdout.flush,则会导致错误,该错误会抱怨redirectStd中未定义flush。在这个阶段,我还没有找到如何为redirectStd定义flush方法。完整的错误消息是

^{pr2}$

有人能为这个问题提供一些解决办法吗?谢谢!在


Tags: 文本importself部件def错误stdoutsys
1条回答
网友
1楼 · 发布于 2024-10-04 05:24:27

我认为您使用多线程的方式可能有问题,请查看下面的文档

https://docs.python.org/2/library/multiprocessing.htmlhttps://docs.python.org/2/library/multiprocessing.html#multiprocessing-programming

我用稍微不同的方法解决了你的问题,希望这有帮助

import sys
import tkinter as tk
from multiprocessing import Pool


class redirectStd():
    def __init__(self, textWidget):
    self.textBoard = textWidget
    #self.flush = sys.stdout.flush
def write(self, msg):
    self.textBoard.insert('end', msg)

def f(x):
    print('calculate:', x, '** 2')
    return x ** 2

if __name__ == '__main__':

    root = tk.Tk()
    root.geometry('600x400+30+30')

    textArea = tk.Text(root, bg='gray', width=70, height=20)
    textArea.pack()
    tk.Button(root, text='click me', command=lambda: print('Dont touch\n me!')).pack()

    sys.stdout = redirectStd(textArea)
    sys.stderr = redirectStd(textArea)

    def testParallel():
        p = Pool(5)
        print(p.map(f, [10, 2, 3]))

    tk.Button(root, text='test multiprocessing', command=testParallel).pack()

    root.mainloop()

相关问题 更多 >