簡體   English   中英

為什么 break 命令不退出循環?

[英]Why does the break command not exit the loop?

在下面的代碼中,我定義了 3 個運行特定時間間隔的線程。 代碼是正確的。 當到達 break 命令時,我希望代碼找到輸入的數字並停止,但它不會停止並繼續。 這是為什么?

import threading
import time    

def thread_func_1():
    
    for i in range(1000,3334):
        time.sleep(0.02)
        print(f"thred1 {i}")
        if number == i:
            print(f"1.. Thread şifreyi buldu: {i}")
            break
            

def thread_func_2():
    
    for i in range(3334,6667):
        time.sleep(0.02)
        print(f"thred2 {i}")
        
        if number == i:
            print(f"2. Thread şifreyi buldu: {i}")
            break

def thread_func_3():
    
    for i in range(6667,10000):
        time.sleep(0.02)
        print(f"thred3 {i}")
        
        if number == i:
            print(f"3. Thread şifreyi buldu: {i}")
            break


print("Lütfen bir sayı giriniz: ")
number = int(input())

t1 = threading.Thread(target=thread_func_1)
t2 = threading.Thread(target=thread_func_2)
t3 = threading.Thread(target=thread_func_3)

t1.start()
t2.start()
t3.start()

在您提供的代碼中,每個線程內的break語句只會跳出該線程內的循環。 它不會停止其他線程或整個程序。

要在找到數字時停止所有線程,您可以使用一個由所有線程檢查的共享標志變量。 當找到數字時,可以將標志設置為True ,線程可以檢查標志並在為 True 時退出。

例子:

# Create a flag variable to signal when the number has been found
found = False

def thread_func_1():
    # Allow found to be overridden inside the function
    global found
    for i in range(1000,3334):
        # Check the flag and exit if it is True
        if found:
            break
        time.sleep(0.02)
        print(f"thred1 {i}")
        if number == i:
            print(f"1.. Thread şifreyi buldu: {i}")
            # Set the flag to True
            found = True

在 function 之外創建的變量是全局變量。 通常,當你在 function 中創建一個變量時,該變量是局部的,並且只能在 function 中使用。因此,如果你想在 function 中更改全局變量,則必須使用global關鍵字。

每個線程都需要檢查某種哨兵以確定它是否應該繼續運行(或不)。

使用信號量或信號有更復雜的方法來執行此操作,但這很簡單、易於理解並且適用於此用例。

通過傳遞適當的參數,可以將原始問題中的 3 個函數減少為一個。

from threading import Thread, Event
from time import sleep

RANGES = [(1000, 3334), (3334, 6667), (6667, 10000)]
EVENT = Event()
THREADS = []

def func(number, r, _id):
    for i in range(*r):
        sleep(0.02)
        if EVENT.is_set():
            break
        print(_id, i)
        if number == i:
            EVENT.set()
            print(f"thred{_id}.. Thread şifreyi buldu: {i}")
            break

def main():
    number = int(input("Lütfen bir sayı giriniz: "))

    for i, r in enumerate(RANGES, 1):
        THREADS.append(Thread(target=func, args=(number, r, i)))
        THREADS[-1].start()

    for t in THREADS:
        t.join()

if __name__ == '__main__':
    main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM