2015-02-01 4 views
1

У меня есть программа python, которую я написал. Эта программа python вызывает функцию внутри модуля, который я также написал, и передает ему некоторые данные.Имейте Python дождитесь окончания функции перед продолжением работы с программой

программа:

def Response(Response): 
    Resp = Response 
def main(): 
    myModule.process_this("hello") #Send string to myModule Process_this function 
    #Should wait around here for Resp to contain the Response 
    print Resp 

Эта функция обрабатывает его и передает его обратно в ответ на функцию отклика в основной программе.

MyModule:

def process_this(data) 
    #process data 
    program.Response(data) 

Я проверил и все данные передаются правильно. Я отказался от импорта и обработки данных, чтобы этот вопрос был как можно более кратким.

Мне нужно найти способ, чтобы Python подождал, чтобы он действительно содержал ответ, прежде чем продолжить работу с программой. Я искал потоки и использовал семафоры или использовал модуль Queue, но я не уверен на 100%, как бы я включил либо в свою программу.

+0

Вы знаете о том, что поток программы будет первым проходить через 'myModule.process_this («привет»)' , и ничего больше не будет вызвано или обработано до тех пор, пока 'process_this' не будет завершен? В чем твоя проблема? – nbro

+0

Я уверен, что это не так, потому что всякий раз, когда я пытаюсь сделать что-либо с Resp, он говорит, что он не определен. Я попытался сделать его глобальным и изменить его область действия, но он все еще ошибки и говорит, что он не определен. Итак, я решил, что это должно быть потому, что он пытается использовать переменную до того, как она была назначена в другом модуле. – Brewer

+0

Функция process_this в myModule имеет функции, которые она запускает, обрабатывая данные, которые я передаю ей. Таким образом, возможно, это связано с тем, что этот process_this завершается, и моя программа все еще пытается получить доступ к переменной до того, как относительные функции myModule присваивают ей значение. – Brewer

ответ

1

Это рабочее решение с очередями и потоковым модулем. Примечание: если ваши задачи ЦП, а не IO связаны, вы должны использовать multiprocessing вместо

import threading 
import Queue 

def worker(in_q, out_q): 
    """ threadsafe worker """ 
    abort = False 
    while not abort: 
     try: 
      # make sure we don't wait forever 
      task = in_q.get(True, .5) 
     except Queue.Empty: 
      abort = True 
     else: 
      # process task 
      response = task 
      # return result 
      out_q.put(response) 
      in_q.task_done() 
# one queue to pass tasks, one to get results 
task_q = Queue.Queue() 
result_q = Queue.Queue() 
# start threads 
t = threading.Thread(target=worker, args=(task_q, result_q)) 
t.start() 
# submit some work 
task_q.put("hello") 
# wait for results 
task_q.join() 
print "result", result_q.get() 
Смежные вопросы