并发编程5

阻塞与非阻塞

  阻塞:程序遇到IO操作,导致代码无法继续执行,交出CPU执行权
  非阻塞:没有IO操作或者遇到IO操作也不阻塞代码执行

  写程序时要尽量减少IO操作

同步与异步

  同步:发起一个任务后,必须原地等待任务执行结束,拿到一个明确的结果

  异步:发起一个任务后,不需要等待,代码继续往下执行

  异步任务的效率高于同步

  异步任务使用场景:当你的任务是不需要立即获得结果的并且还有其他的任务需要处理

  发起异步任务的方式:多进程,多线程

  同步和阻塞的区别:

    阻塞一定意味着CPU切走了,而同步有可能是计算任务耗时较长

异步回调

  给异步任务绑定一个函数,当任务完成时会自动调用该函数

  当你往进程池或线程池对象中添加了一个异步任务,会返回一个表示结果的对象

  有一个对象绑定方法add_done_callback,需要一个函数作为参数

  注意:回调函数必须有且仅有一个参数,就是对象本身通过对象.result来获取结果

  回调函数交给子线程来执行,

  优点:不会原地等待,任务结束可以立即获取结果

线程队列

  queue该模块下提供了一些常用的数据容器但是它们仅仅时容器没有数据共享的特点

  Queue:先进先出

  LifoQueue:先进后出

  PriorityQueue:传入一个元组,第一个值是优先级,第二个值是值

事件

  是一个通知消息,表示什么时间发生了什么事

  用于线程间通讯

  线程之间,执行流程是独立的,一些时候可能需要知道另一个线程发生了什么

  事件就是帮你维护了一个bool值

  在bool为True之前,wait函数将一直阻塞

协程

  一个单线程并发执行多个任务

  用于提高效率,在检测到IO操作时,切换到其他的非IO操作

  程序在操作系统眼中依然没有阻塞

  greenlet 是对yield进行了封装,简化了书写但他不能检测IO操作

  gevent可在单线程实现并发,又可以检测IO操作

  

原文地址:https://www.cnblogs.com/LinChengcheng/p/10512366.html