Проблема заключалась в том, что переменная flag , определенная и использованная в main , была локальной и не имела ничего общего с той, что использовалась потоком, поэтому поток никогда не получал уведомления от его изменение (и, следовательно, новее знал, когда пора остановиться).
Исправление простое, сделайте переменную глобальной в main (так же, как это уже было сделано в square ):
global flag
квадрат функция также может быть упрощена вместо:
while True:
# The other instructions
if(flag):
break
Вы могли бы сделать:
while not flag:
# The other instructions
Как примечание, существуют и другие способы синхронизации между потоками, , например, :
threading.Event
- сделать вашу нить демоном (
p = threading.Thread(target=square, daemon=True)
, даже если это вообще не рекомендуется), означая, что он внезапно остановится, когда main достигнет своего конца
Для получения дополнительной информации, проверьте [Python 3.docs]: многопоточность - параллелизм на основе потоков .