首页 > 编程知识 正文

python线程如何终止线程,python判断线程退出

时间:2023-05-05 17:07:30 阅读:59157 作者:1013

问题

你的程序有多个线程,需要在这些线程之间安全地交换信息和数据

解决方案

将数据从一个线程发送到另一个线程的最安全的方法可能是使用queue库中的队列。 创建由多个线程共享的队列对象。 这些线程使用put (和get )操作在队列中添加或删除元素。 例如:

由于Queue对象已经包含所需的锁,因此可以使用它在多个线程之间安全地共享数据? 使用队列时,协调生产者和消费者的封闭问题可能存在一些麻烦。 一种常见的解决方案是将特殊值放在队列中,并在消费者阅读该值时停止执行。 例如:

这个例子有特别的地方。 消费者在阅读完这个特殊值后立即将其放回队列中传递。 这样,您就可以关闭拦截此队列的所有消费者线程。 队列是最常见的线程间通信机制,但您可以通过创建自己的数据结构并添加所需的锁定和同步机制来实现线程间通信。 最常见的方法是使用Condition变量包装数据结构。 以下示例说明如何创建线程安全首选队列

使用队列进行线程间通信是一个单方面和不确定的过程。 通常,不知道接收数据的线程是什么时候接收数据并开始工作的。 但是,队列对象具有基本功能,如以下示例中的task_done (或join ) :

如果一个线程需要在“消费者”线程处理特定数据项后立即收到通知,则可以将发送的数据和事件一起使用,以允许“生产者”从此事件对象监视处理过程。 以下是示例。

讨论

基于简单队列编写多线程程序往往是明智的选择。 从线程安全队列的基本实现来看,代码不需要使用锁定或其他基本同步机制。 这些只会扰乱程序。 另外,使用队列这一基于消息的通信机制可以扩展到更大的APP应用程序范围。 例如,程序可以包含在多个进程中,甚至包含在分布式系统中,而不更改底层队列结构。 使用线程队列时需要注意的一个问题是,向队列中添加数据项不会复制该数据项。 线程间通信实际上是在线程之间传递对象引用。 如果担心对象的共享状态,建议只传递不可修改的数据结构(如整数、字符串、元组)或对象的深副本。 例如:

Queue对象具有在当前上下文中有用的其他属性。 例如,在创建Queue对象时指定可选的size参数,以限制可以添加到队列中的元素数。 如果“生产者”和“消费者”的速度存在差异,则为队列中的要素数添加上限是有意义的。 例如,如果一个“生产者”产生项目的速度比“消费者”“消费者”快,则使用固定大小的队列可以防止意外的连锁效应扩散整个程序并导致死锁,也不会干扰程序的运行在通信线程之间进行“流量控制”是一个似乎很难实现的问题。 如果你曾试图通过摆弄队列大小来解决问题,这可能表明你的程序可能存在脆弱的设计或固有的可伸缩问题。 get (和put )方法支持以下无阻塞方法和设置超时:

这些操作可以用于防止在执行特定队列操作时发生无限的块。 例如,未阻止的put ) )方法和固定大小的队列,以便在队列已满时执行不同的代码。 例如输出日志信息并废弃。

如果希望消费者线程在执行类似q.get ()的操作时自动退出超时并检查退出标志,则必须使用q.get )的可选参数timeout,如下所示:

最后,获取队列的当前大小和状态的实用方法包括q.qsize ()、q.full ()和q.empty () )。 但是请注意,这些方法不是线程安全的。 对于一个队列的empty ) )来确定此队列为空,但另一个线程可能已经在此队列中插入了数据项。 所以,你最好不要在代码中使用这些方法。

以上是Python如何实现线程间通信的详细内容。 请注意服务器主页上的其他相关文章,以获取有关Python线程间通信的资料。

原文链接: https://python3- cookbook.readthedocs.io/zh _ cn/latest/c12/p03 _ communicating _ between _ threads.htmmy

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。