问候!
我想知道这两个可重现性最低的示例之间是否存在根本区别。在第一种情况下,我使用标志self.flagClose = True来指示流关闭,而在第二种情况下,我将它用于asyncio.Event相同的目的。
from threading import Thread
import time
class Main():
def __init__(self):
self.flagClose = True
t1 = Thread(target=self.task)
t1.start()
def task(self):
while True:
if self.flagClose:
print("Close")
return
else:
print("Not close")
print("...")
time.sleep(3)
obj = Main()
和
from asyncio import Event
from threading import Thread
import time
class Main():
def __init__(self):
t1 = Thread(target=self.task)
t1.start()
def task(self):
while True:
if event.is_set():
print("Close")
return
else:
print("Not close")
print("...")
time.sleep(3)
event = Event()
event.set()
#event.clear()
obj = Main()
提前致谢!
是的,这两个示例之间存在根本区别,因为它们使用不同的线程同步机制。
在第一个示例中,您使用了 self.flagClose 标志,该标志在 Main 类的构造函数中设置为 True。然后创建一个线程 t1 来执行 Main 类的任务方法。在任务方法中,线程执行一个无限循环来检查 self.flagClose 标志的值。如果标志设置为 True,线程将显示“关闭”消息并退出。否则,线程会显示“未关闭”消息并继续。
在第二个示例中,您使用的是在 Main 类之外创建的 asyncio.Event 对象。您通过调用事件对象的 set() 方法在构造函数中设置事件。然后创建一个线程 t1 来执行 Main 类的任务方法。在任务方法中,线程执行一个无限循环来检查事件是否已设置。如果设置了事件,线程将显示“关闭”消息并退出。否则,线程会显示“未关闭”消息并继续。
所以第一个例子使用了normal flag来同步线程,而第二个例子使用了asyncio库提供的事件机制。两种机制都有其优点和缺点,它们之间的选择取决于您要解决的具体问题。
旗帜的好处:
简单性:使用标志来同步线程是一种简单直接的方法。标志很容易创建、设置和测试。
高速:检查标志的值比等待事件更快,这对于高性能应用程序很重要。
可靠性:使用标志同步线程通常更可靠,因为它们不会错过事件信号,也不会受到网络延迟或 CPU 过载等外部因素的影响。
旗帜的缺点:
阻塞风险:如果标志设置或清除不正确,可能会发生线程阻塞,导致应用程序变慢甚至崩溃。
限制:标志不能用于更复杂的同步场景,例如同时等待多个事件或同步在不同资源上运行的线程。
不支持异步:标志不适合在异步应用程序中使用,如果使用不当可能会导致应用程序阻塞。
活动福利:
灵活性:事件可用于同步各种场景,包括同时等待多个事件。
异步:事件支持异步,可以在异步应用中使用。
可靠性:事件通常比标志更可靠,因为它们不会被错误地设置或重置。
活动缺点:
速度较慢:事件检查比标志检查慢,这对于高性能应用程序来说可能是不可接受的。
复杂性:使用事件可能更复杂并且需要更多代码。
阻塞风险:如果未正确配置或正确使用事件,使用事件也可能导致线程阻塞。例如,如果事件未设置或设置不正确,则线程会挂起等待此事件,这会减慢应用程序或导致其崩溃。
调试困难:使用事件时,调试代码会更加困难,因为它们在异步环境中运行,并可能导致同步和线程问题。
有限支持:一些编程语言不直接支持事件,这会限制这种同步机制的使用。
内存消耗:使用事件可能需要额外的资源,例如内存,这对于资源受限的应用程序来说可能是不可接受的。