2013-02-08 2 views
1

У меня есть две программы program1.py - это как интерфейс командной строки, который принимает команду от пользователя program2.py имеет программу, которая запускает соответствующую программу в соответствии с командой.запустить программу python в новом потоке

Программа 1 также имеет модуль в quit_program() В нашей простой вселенной .. позволяет сказать, что у меня есть только одна команда, и только одну программу Так позволяет сказать ...

program1.py

def main(): 
    while True: 
     try: 

      command = raw_input('> ') 
      if command == "quit" : 
       return 

      if command == '': 
       continue 
     except KeyboardInterrupt: 
      exit() 

     parseCommand(command) 

А потом у меня есть:

if commmand == "hi": 
     say_hi() 

Теперь program2 имеет

def say_hi(): 
     #do something.. 

Теперь может быть два случая ... Либо say_hi() завершается в этом случае нет вопрос ... Но что я хочу, что если пользователь вводит команду (например: конец) этот say_hi () заканчивается между ними.

Но моя текущая реализация очень последовательна. Я имею в виду, что я не собираюсь вводить что-либо на моем терминале до завершения исполнения. Somethng сообщает мне, что say_hi() должен быть запущен на другой поток?

Я не могу думать об этом прямо. Любые предложения? Thanks

ответ

6

Модуль резьбонарезания - это то, что вы ищете.

import threading 
t = threading.Thread(target=target_function,name=name,args=(args)) 
t.daemon = True 
t.start() 

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

Специфического на этот вопрос, и вопрос в комментариях, функцию say_hi можно назвать в другом потоке, как например:

import threading 
if commmand == "hi": 
    t = threading.thread(target=say_hi, name='Saying hi') #< Note that I did not actually call the function, but instead sent it as a parameter 
    t.daemon = True 
    t.start() #< This actually starts the thread execution in the background 

в качестве примечания, вы должны убедиться, что вы используете Потокобезопасную функции внутри нитей. В примере говорят привет, вы хотели бы использовать модуль ведения журнала вместо печати()

import logging 
logging.info('I am saying hi in a thread-safe manner') 

Вы можете прочитать больше in the Python Docs.

+0

Hi .. но с этим .. как я смогу запустить «say_hi()» в фоновом режиме ..? и все еще сохраняю управление, чтобы я мог вводить команды в терминале – Fraz

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