Python多处理赢得了';行不通

Python多处理赢得了';行不通,python,Python,以下是代码的相关部分: x=None def pp(): global x x=MyClass() x.start() def main(): global x p=Process(target=pp) p.start() while x==None: print("Not yet...") while 1: print(x.getoutput(),end="") p.join() if

以下是代码的相关部分:

x=None

def pp():
    global x
    x=MyClass()
    x.start()

def main():
    global x
    p=Process(target=pp)
    p.start()
    while x==None:
        print("Not yet...")
    while 1:
        print(x.getoutput(),end="")
    p.join()

if __name__=='__main__':
    main()
start()方法打开一个TKInter窗口,因此它将永远运行(至少在用户关闭窗口之前)。我正在尝试运行另一个进程,该进程将从已使用的窗口获取信息,但它不起作用


如何使其工作?

我觉得这里首先要指出的是,每个子进程都将导入主脚本并拥有自己的本地副本。不可能以您在这里尝试的方式使用全局变量,因为子进程不使用相同的名称空间。如果设置为此使用多处理,则需要使用某种描述的通信管道,如以下文档中所述:

我有点好奇,在这里使用多处理的最终目标是什么。不过,如果你真的想这么做,还是有可能的:

import multiprocessing
import tkinter
import time

def worker(q):
    #q is a queue for communcation.
    #Set up tkinter:
    root = tkinter.Tk()
    localvar = tkinter.StringVar()
    wind = tkinter.Entry(root,textvariable=localvar)
    wind.grid()

    #This callback puts the contents of the entry into the queue
    #when the entry widget is modified
    def clbk(name,index,mode,q=q):
        q.put(localvar.get())
    localvar.trace_variable('w',clbk)

    #Some window dressing that will signal to the main process that 
    #the window has been closed
    def close(root=root,q=q):
        q.put('EXIT')
        root.destroy()
        root.quit()
    root.protocol("WM_DELETE_WINDOW",close)
    root.mainloop()

def main():
    #Make a queue to facilitate communication:
    queue = multiprocessing.Queue()
    p = multiprocessing.Process(target=worker,args=(queue,))
    p.start()

    #Wait for input...
    while True:
        ret = queue.get()
        print(ret)
        if ret=='EXIT':
            break
        time.sleep(0.1)
    #Finally, join the process back in.
    p.join()

if __name__ == '__main__':
    main()

忽略窗口装饰,它现在将打印输入tkinter entry小部件的文本,并在窗口关闭时退出

如果这只是为了实现功能而不是加速,那么您可能希望使用与原始线程共享内存的线程。处理过程不那么简单。这有什么不同吗?真的有那么复杂吗?好吧,不管怎样,你提到它可以不用多任务完成,怎么会呢?不管它现在能工作了。为了避免像xkcd漫画中说的那样:我在MyClass和main()之间使用了一个队列,以获得输出。这取决于您的意图——如果您想要的只是一个弹出窗口,那么我建议使用一个tkinter.Toplevel对象,您更应该看到它;如果不知道为什么要在这里进行多重处理,就很难提供更多的信息。如果该键能够监视用户输入,则具有tkinter变量和trace_变量的条目小部件(如示例中所述)将允许您在修改变量时调用函数。