Python的并发程序可以使用multiprocessing库、threading库、asyncio库、concurrent.futures库以及selectors库等等协助编写:

  1. multiprocessing库可以创建多个进程,由系统协调调度各个任务;
  2. threading库则是创建多个线程,由Python解释器在一条进程内并发执行任务,始终只占用一个CPU核心资源,会遇到臭名昭著的GIL问题;
  3. asyncio库则是将任务中的IO密集部分单拎出来,系统可以在等待IO密集部分返回的同时多次执行计算密集代码,所有任务都在一条线程内执行;
  4. concurrent.futures库可以用来创建线程池或进程池,更适合编写粒度较细的并发任务代码。
  5. selectors库是对select库的高级封装;而后者则是对Unix的select、poll、Linux的epoll、BSD的Kqueue等等IO复用方法的低级封装库。

multiprocessing库、threading库、asyncio库的有着类似的同步条件:Lock、RLock、Condition、Semaphore、Barrier、Event等:

  1. Lock、RLock较为类似,可以用来将一组操作原子化。RLock的特殊之处在于,可以被同一条线程递归调用,当然用完之后也得递归解锁。
  2. Condition可以保证多组线程阻塞在同一位置,等候其他线程的通知,防止因为资源为空时发生错误。
  3. Semaphore用于确保不会有过多线程同时访问某一资源。
  4. Barrier则用于保证所有线程各自在某一位置阻塞,当所有线程都阻塞时,又各自开始执行下一条指令。
  5. Event较为简单,一条线程可能阻塞等候event对象被另一条线程设置为true。

线程的好处是有共享的内存空间,方便线程间的交流。而进程则需要特殊的机制。multiprocessing库提供了queue和pipe两种机制用于进程间交流。这两类的不同之处在于:queue的内容可以被所有进程访问到,pipe只能被两个进程访问到,信息的安全程度较高。multiprocessing库还可以使用Manager对象为各个进程提供共享内存空间。

此外,Python为线程提供了queue.Queue和collections.deque满足线程的交流需求。后者的入队出队操作都是线程安全的。

而asyncio库有自己的queue类可以用于协程间的交流。

asyncio库的使用方法与前两者区别较大。当调用async def定义协程函数时,内部使用await等候另一个协程函数返回。使用asyncio协程库需要清晰的区分出IO密集操作和计算密集操作,也就是手动调度并发任务。多线程库则依靠解释器自动调度并发任务。asyncio库使用方法较为复杂,更多内容请看官方文档——18.5. asyncio – Asynchronous I/O, event loop, coroutines and tasks¶

concurrent.futures库可以使用with语句来并发执行粒度较细的并发任务,也可以使用submit()方法来单独执行一个函数,返回一个future对象。future可以用于对对应任务的撤销、结果传递、回调函数设置、异常分析等等操作。

Python多线程开发简介的更多相关文章

  1. 【学习笔记】第一章 python安全开发简介

    1.1为什么黑客喜欢用python? python为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量内容,被形象的称为“”内置电池“”,用python开发,许多功能不必从零 ...

  2. Python自动化开发-简介

    1.Python简介 Python创始人  Guido Van Rossum,人称"龟叔",1989年圣诞节期间,为了在阿姆斯特丹打发时间,开发的一个新的脚本解释程序 作为ABC语 ...

  3. python 多进程开发与多线程开发

    转自: http://tchuairen.blog.51cto.com/3848118/1720965 博文作者参考的博文:  博文1  博文2 我们先来了解什么是进程? 程序并不能单独运行,只有将程 ...

  4. Python Web开发中的WSGI协议简介

    在Python Web开发中,我们一般使用Flask.Django等web框架来开发应用程序,生产环境中将应用部署到Apache.Nginx等web服务器时,还需要uWSGI或者Gunicorn.一个 ...

  5. Python多线程问题的资料查找与汇总

    Python多线程问题的资料查找与汇总 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系作者bitpea ...

  6. python自动化开发学习 I/O多路复用

    python自动化开发学习 I/O多路复用   一. 简介 socketserver在内部是由I/O多路复用,多线程和多进程,实现了并发通信.IO多路复用的系统消耗很小. IO多路复用底层就是监听so ...

  7. python多线程+生产者和消费者模型+queue使用

    多线程简介 多线程:在一个进程内部,要同时干很多事情,就需要同时执行多个子任务,我们把进程内的这些子任务叫线程. 线程的内存空间是共享的,每个线程都共享同一个进程的资源 模块: 1._thread模块 ...

  8. 《Python Web开发实战》|百度网盘免费下载|Python Web开发

    <Python Web开发实战>|百度网盘免费下载|Python Web开发 提取码:rnz4 内容简介 这本书涵盖了Web开发的方方面面,可以分为如下部分: 1. 使用最新的Flask ...

  9. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

随机推荐

  1. 通过DIV+span方式模拟进度条的实现方法

    上上周用FusionCharts做报表时,有个图是进度条的形式,其实在FusionCharts 3.0之后已经支持了(Linear Gauge),可惜现有系统用的还是1.2.3版本的,重新引入新版本有 ...

  2. jquery 使用方法(二)

    jquery語法: jquery語法是為html元素的选取编制的,可以对元素执行某些操作. 基础语法是:$(selector).action() 美元符号定义 jQuery 选择符(selector) ...

  3. Java 实现多线程的两种方式

    1:继承Therad类2:实现Runnable 接口 1.继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实 ...

  4. unity5.0新功能

    原作者 只待苍霞 章节1: 先来两个最关心的新功能, 第一章先讲PBS, 第二章讲光影GI.说到PBS, 首先应该想到的是Unity自带的两个新的Shader, 分别是Standard以及Standa ...

  5. 在c#中把字符串转为变量名并获取变量值的小例子(转)

    public class Program { public string str = "spp"; public string spp = "Hello World!&q ...

  6. poj3678 Katu Puzzle 2-SAT

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6714   Accepted: 2472 Descr ...

  7. #define 小知识

    #define N 15 #define M 2+N #define W 2*M 问3*W的结果是多少? 结果为27: 知识点:define只能进行非常简单的运算,简单来说就是仅仅是将自身的值代入,而 ...

  8. IOS系列swift语言之课时六

    这节课需要讲的就是协议,方法,委托模式(依赖倒转) 代码刷起中...... // // main.swift // ExAndProtocol // // Created by David on 23 ...

  9. 走进异步编程的世界 - 开始接触 async/await

    [C#] 走进异步编程的世界 - 开始接触 async/await   走进异步编程的世界 - 开始接触 async/await 序 这是学习异步编程的入门篇. 涉及 C# 5.0 引入的 async ...

  10. LeetCode 445 Add Two Numbers II

    445-Add Two Numbers II You are given two linked lists representing two non-negative numbers. The mos ...