Я хочу остановить поток квадратной функции в Python, но она не работает? - PullRequest
1 голос
/ 27 апреля 2019

Я создал функцию квадратов, которые начнут возводить в квадрат с 1,2 ... когда я наберу "начало", и в итоге возведем в квадрат, когда я наберу "стоп".Когда я набрал «start», я начал получать квадраты чисел через каждые 2 секунды, но когда я набрал «stop», поток не остановился. Я использовал переменную «flag», чтобы остановить функцию.Вот код.

import threading
import time
flag=False
def square():
    i=1;
    global flag
    while(True):
        print(i*i,"\n")
        time.sleep(2)
        i=i+1
        if(flag):
            break

def main():
    while(True):
        x=input("Enter start/stop")
        if(x=="start"):
            flag=False
            p = threading.Thread(target=square)
            p.start()
        if(x=="stop"):
            flag=True
            p.join()

main()

1 Ответ

2 голосов
/ 27 апреля 2019

Проблема заключалась в том, что переменная 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]: многопоточность - параллелизм на основе потоков .

...