[英]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.