美文网首页Python小哥哥
Python并发编程之线程消息通信机制任务协调

Python并发编程之线程消息通信机制任务协调

作者: 我爱学python | 来源:发表于2019-06-01 16:06 被阅读9次

前言

今天,我们就来探讨一下如何控制线程的触发执行。

要实现对多个线程进行控制,其实本质上就是消息通信机制在起作用,利用这个机制发送指令,告诉线程,什么时候可以执行,什么时候不可以执行,执行什么内容。

经过我的总结,线程中通信方法大致有如下三种:

threading.Event

threading.Condition

queue.Queue

先抛出结论,接下来我们来一一探讨下。

Event事件

Python提供了非常简单的通信机制 Threading.Event,通用的条件变量。多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活。

关于Event的使用也超级简单,就三个函数

举个例子来看下。

执行一下,看看结果

可见在所有线程都启动(start())后,并不会执行完,而是都在self.event.wait()止住了,需要我们通过event.set()来给所有线程发送执行指令才能往下执行。

Condition

Condition和Event 是类似的,并没有多大区别。

同样,Condition也只需要掌握几个函数即可。

举个网上一个比较趣的捉迷藏的例子来看看

通过cond来通信,阻塞自己,并使对方执行。从而,达到有顺序的执行。

看下结果


Queue队列

终于到了我们今天的主角了。

从一个线程向另一个线程发送数据最安全的方式可能就是使用 queue 库中的队列了。创建一个被多个线程共享的 Queue 对象,这些线程通过使用put() 和 get() 操作来向队列中添加或者删除元素。

同样,对于Queue,我们也只需要掌握几个函数即可。

函数会比之前的多一些,同时也从另一方面说明了其功能更加丰富。

我来举个老师点名的例子。

运行结果如下


总结

学习了以上三种通信方法,我们很容易就能发现Event 和 Condition 是threading模块原生提供的模块,原理简单,功能单一,它能发送 True 和 False 的指令,所以只能适用于某些简单的场景中。

而Queue则是比较高级的模块,它可能发送任何类型的消息,包括字符串、字典等。其内部实现其实也引用了Condition模块(譬如put和get函数的阻塞),正是其对Condition进行了功能扩展,所以功能更加丰富,更能满足实际应用。

相关文章

  • Python并发编程之线程消息通信机制任务协调

    前言 今天,我们就来探讨一下如何控制线程的触发执行。 要实现对多个线程进行控制,其实本质上就是消息通信机制在起作用...

  • java内存模型笔记一

    1.在并发中处理两个问题:a.线程之间如何通信 b.线程之间如何同步 2.线程之间通信机制:共享内存与消息传递 3...

  • Java内存模型

    线程之间的通信和同步 线程之间的通信和同步是并发编程领域的关键问题。 线程之间的通信 通信是指线程之间以何种机制来...

  • Java内存模型

    通讯:指线程之间以何种机制来交换信息 Java线程之间的通信机制有两种: 内存共享和消息传递。内存共享的并发模型...

  • Java内存模型

    线程间通信与同步 在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共...

  • Java内存模型(JMM)

    线程之间的通信机制有两种:共享内存和消息传递。Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进...

  • 最详细分析Java 内存模型

    并发编程中, 线程之间如何通信及线程之间如何同步, 通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间...

  • java多线程(八)JMM和底层实现原理

    线程之间的通信线程的通信是指线程之间以何种机制来交换信息。在编程中,线程之间的通信机制有两种,共享内存和消息传递。...

  • 并发编程基础

    并发编程 并发编程主要解决两个问题: 线程之间如何通信,指线程之间以何种机制交换信息。 线程之间如何同步,指程序控...

  • 啃碎并发(九):内存模型之基础概述

    前言 在并发编程中,需要解决两个关键问题: 线程之间如何通信;线程之间如何同步; 线程通信是指线程之间以何种机制来...

网友评论

    本文标题:Python并发编程之线程消息通信机制任务协调

    本文链接:https://www.haomeiwen.com/subject/ytdatctx.html