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_变量的条目小部件(如示例中所述)将允许您在修改变量时调用函数。