当前位置: 首页 > 知识库问答 >
问题:

停止线程:标志与事件[重复]

卫学真
2023-03-14
class MyThread(threading.Thread):

    def __init__(self):
        self._please_stop = threading.Event()

    def run(self):
        while not self._please_stop.is_set():
        [...]

    def stop(self):
        self._please_stop.set()
class MyThread(threading.Thread):

    def __init__(self):
        self._please_stop = False

    def run(self):
        while not self._please_stop:
        [...]

    def stop(self):
        self._please_stop = True

如果同一个事件在几个线程之间共享,我可以理解这一点,但否则,我就不明白了。

这个邮件列表线程表明事件会更安全,但我不清楚为什么。

更确切地说,我不明白那两段话:

共有1个答案

柯瀚玥
2023-03-14

编程通常不仅仅是让代码在今天工作,而是让它在未来的变化中继续工作。

  • 其他Python实现没有GIL。我明天要在pypy上运行吗?
  • 实际上,我需要将工作分散到几个过程中。在多处理...它实现event(),但是如果只是使用局部变量,它将失败。
  • 证明,只有当其他几个线程认为应该停止时,代码才应该停止。那么,使用semaphore()代替event()······但是很容易用变量错误地实现。

因此,很可能您可以在Python中完全正确地编写多线程程序,这取决于字节码如何被中断以及何时可以释放GIL...但是,如果我以后阅读和更改您的代码,如果您使用标准同步原语,我会更高兴。

 类似资料:
  • 问题 你要为需要并发执行的代码创建/销毁线程 解决方案 threading 库可以在单独的线程中执行任何的在 Python 中可以调用的对象。你可以创建一个 Thread 对象并将你要执行的对象以 target 参数的形式提供给该对象。 下面是一个简单的例子: # Code to execute in an independent thread import time def countdown(

  • 我有一个调用外部应用程序的Restful服务。这个应用程序使我的服务挂起。因此,当用户调用我的服务时,由于这个外部应用程序,可能需要一个小时。外部应用程序只需几秒钟即可执行。否则,就出了问题。因此,我希望我的服务中的代码最多执行30秒。如果超过30秒,我想停止服务并重新启动它。 以下是我想要的: 我不希望代码每30秒执行一次。我希望能够停止代码执行,并从头重新启动它。 服务内容如下:

  • 问题内容: 当我为实体创建时,在Spring Data REST中不会通过Spring Boot 1.4.0.M3(也是Spring Boot 1.3.5)触发关联的方法-这是Bug还是 设计 错误? 我有一个具有的实体: 在我发布时应触发: 除非我添加: 当我注释掉注释时,方法再次触发。 由于它们在Spring Data REST中运行两个不同的概念层,因此它们似乎应该独立运行-还是我误会了什么

  • 我有一个程序,当你点击“开始”时移动鼠标光标 单击“开始”,我创建了一个新线程,光标开始移动。当我单击“暂停”时,即使变量设置为false,光标仍会移动。 我不明白为什么当我点击“暂停”时,鼠标会一直移动,即使移动设置为false。 有人能看出我哪里出了问题,或者是否有更好的方法来解决这个问题吗?

  • 问题内容: 我正在编写一段连接到服务器的代码,使用该连接会生成一堆线程并执行一堆“工作”。 在某些情况下,连接失败,我需要停止所有操作并从头开始创建新对象。 我想在对象之后进行清理,但在线程上调用thread.stop,但是此方法似乎已被弃用。 推荐的替代方法是什么?是否应该为每个线程编写自己的清理和退出方法?将线程设置为null?或者是其他东西? 问题答案: 看这里 : 在HowToStopAT