RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1499518
Accepted
Alexey
Alexey
Asked:2023-02-24 19:57:38 +0000 UTC2023-02-24 19:57:38 +0000 UTC 2023-02-24 19:57:38 +0000 UTC

多线程。事件和标志之间有区别吗?

  • 772

问候!

我想知道这两个可重现性最低的示例之间是否存在根本区别。在第一种情况下,我使用标志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()

提前致谢!

python
  • 1 1 个回答
  • 29 Views

1 个回答

  • Voted
  1. Best Answer
    HaZcker
    2023-02-24T20:06:46Z2023-02-24T20:06:46Z

    是的,这两个示例之间存在根本区别,因为它们使用不同的线程同步机制。

    在第一个示例中,您使用了 self.flagClose 标志,该标志在 Main 类的构造函数中设置为 True。然后创建一个线程 t1 来执行 Main 类的任务方法。在任务方法中,线程执行一个无限循环来检查 self.flagClose 标志的值。如果标志设置为 True,线程将显示“关闭”消息并退出。否则,线程会显示“未关闭”消息并继续。

    在第二个示例中,您使用的是在 Main 类之外创建的 asyncio.Event 对象。您通过调用事件对象的 set() 方法在构造函数中设置事件。然后创建一个线程 t1 来执行 Main 类的任务方法。在任务方法中,线程执行一个无限循环来检查事件是否已设置。如果设置了事件,线程将显示“关闭”消息并退出。否则,线程会显示“未关闭”消息并继续。

    所以第一个例子使用了normal flag来同步线程,而第二个例子使用了asyncio库提供的事件机制。两种机制都有其优点和缺点,它们之间的选择取决于您要解决的具体问题。


    旗帜的好处:

    简单性:使用标志来同步线程是一种简单直接的方法。标志很容易创建、设置和测试。

    高速:检查标志的值比等待事件更快,这对于高性能应用程序很重要。

    可靠性:使用标志同步线程通常更可靠,因为它们不会错过事件信号,也不会受到网络延迟或 CPU 过载等外部因素的影响。


    旗帜的缺点:

    阻塞风险:如果标志设置或清除不正确,可能会发生线程阻塞,导致应用程序变慢甚至崩溃。

    限制:标志不能用于更复杂的同步场景,例如同时等待多个事件或同步在不同资源上运行的线程。

    不支持异步:标志不适合在异步应用程序中使用,如果使用不当可能会导致应用程序阻塞。




    活动福利:

    灵活性:事件可用于同步各种场景,包括同时等待多个事件。

    异步:事件支持异步,可以在异步应用中使用。

    可靠性:事件通常比标志更可靠,因为它们不会被错误地设置或重置。


    活动缺点:

    速度较慢:事件检查比标志检查慢,这对于高性能应用程序来说可能是不可接受的。

    复杂性:使用事件可能更复杂并且需要更多代码。

    阻塞风险:如果未正确配置或正确使用事件,使用事件也可能导致线程阻塞。例如,如果事件未设置或设置不正确,则线程会挂起等待此事件,这会减慢应用程序或导致其崩溃。

    调试困难:使用事件时,调试代码会更加困难,因为它们在异步环境中运行,并可能导致同步和线程问题。

    有限支持:一些编程语言不直接支持事件,这会限制这种同步机制的使用。

    内存消耗:使用事件可能需要额外的资源,例如内存,这对于资源受限的应用程序来说可能是不可接受的。

    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5