1

Я пытаюсь сделать программу Python, которая будет очень похожа на оболочку: в основном ждет ввода пользователя, изредка отображая сообщение из другого потока.Многопоточная программа, которая имитирует оболочку

Имея это в виду, я сделал следующий пример кода:

import threading 
import time 

def printSomething(something="hi"): 
    while True: 
     print(something) 
     time.sleep(2) 

def takeAndPrint(): 
    while True: 
     usr = input("Enter anything: ") 
     print(usr) 

thread1 = threading.Thread(printSomething()) 
thread2 = threading.Thread(takeAndPrint()) 

thread1.start() 
thread2.start() 

Что я ожидал, чтобы это произошло

пользователю предлагается для ввода; иногда это приводит к тому, что их сообщение выводится, в других случаях сначала печатается сообщение printSomething.

Enter anything: 
hi 
Enter anything: hello 
hello 
Enter anything: 
hi 

Что на самом деле произошло

Оказывается, что только printSomething работает:

hi 
hi 
hi 

Что мне нужно сделать, чтобы иметь непрерывную подсказку для ввода данных пользователя, а также вывод на печать сообщений из другой нити при необходимости?

ответ

4

Обратите внимание, что Python оценивает аргументы перед вызовом функции. Поэтому линия:

thread1 = threading.Thread(printSomething()) 

фактически эквивалентна:

_temp = printSomething() 
thread1 = threading.Thread(_temp) 

Это, возможно, теперь понятнее, что происходит - Thread никогда не создается, не говоря уже о start ред перед нескончаемым while цикла в printSomething. Если бы вы изменили порядок создания, вы бы видели другой цикл.

Вместо этого в the documentation, необходимо использовать параметр target установить

Вызываемая объект, который будет вызван в run() методом

Например:

thread1 = threading.Thread(target=printSomething) 

Примечание: нет круглых скобок после printSomething - вы не хочу называть это еще.

+1

ОК хорошо ... намного лучше, чем мой ответ: P .... хотя, возможно, вы должны сохранить спойлер в качестве учебного упражнения для пользователя: P (+1) –

+0

Спасибо за вашу помощь. Если я сначала запускаю 'thread2' вместо' thread1', он все равно выполняет список 'hi'. – fdsa

+0

@fdsa - снова, ** 'start' никогда не доходит **. Неважно, в каком порядке вы их запускаете, но какой заказ вы * назначаете * их. Пожалуйста, внимательно прочитайте мой ответ. – jonrsharpe

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