2015-04-16 5 views
-1

Вот соответствующая часть кода: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 __name__=='__main__': 
    main() 

x.start() метод открывает окно Tkinter, поэтому она работает навсегда (или, по крайней мере до тех пор, пока пользователь не закроет окно). Я пытаюсь запустить другой процесс, который будет получать информацию из используемого окна, но он не работает.

Как я могу заставить его работать?

+0

Если это только для создания функциональных вещей, а не для ускорения работы, вы, вероятно, захотите использовать потоки, которые обмениваются памятью с исходной нитью. Процессы немного менее просты в обращении. –

+0

Это имеет значение? –

ответ

0

Я чувствую, что первое, что нужно отметить, это то, что каждый дочерний процесс будет импортировать основной скрипт и иметь собственную локальную копию. Невозможно использовать глобальные переменные так, как вы пытаетесь здесь, потому что дочерние процессы не используют одно и то же пространство имен. Если вы установите на использование мультипроцессирования для этого, вам нужно использовать коммуникационную трубу некоторого описания, как описано в следующей документации:

http://pymotw.com/2/multiprocessing/communication.html#multiprocessing-queues

Я немного любопытно, что ваша конечная цель здесь используя многопроцессорность. Тем не менее, если вы действительно хотите сделать это, возможно:

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 виджета, и выходит, когда окно закрыто.

+0

Неужели это так сложно? Что бы вы ни говорили, это можно сделать без многозадачности, как это? –

+0

Nevermind теперь работает. Чтобы не быть таким, как xkcd comic сказал: я использовал очередь между MyClass и main(), чтобы получить результат –

+0

. Это зависит от вашего намерения здесь - если бы все, что вы хотели, было всплывающим окном, то я предлагаю, чтобы tkinter .Toplevel объект больше, что вы должны смотреть; трудно быть более информативным, не зная, почему вы хотите многопроцессорствовать здесь. Если бы ключ был в состоянии контролировать вход пользователя, то виджет ввода с переменной tkinter и trace_variable, как описано в примере, позволит вам вызывать функцию всякий раз, когда изменяется переменная. – Phren

Смежные вопросы