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. CocoaPods安装及使用《转》

    http://www.cnblogs.com/eagley/p/5407721.html

  2. rabbitMQ+yii2 使用

    安装rabbitMQ 见此文章 http://www.cnblogs.com/zxxyx/p/6229613.html 安装好之后 出现此目录: 然后需要yii里面进行载入: 这个目录下面: 加上这个 ...

  3. highcharts 柱状图 动态加载

    highcharts柱状图动态加载 (1):导入样式 <script type="text/javascript" src="<%=request.getCo ...

  4. 关于adb shell getprop相关

    adb shell : getprop 查看机器的全部信息参数 getprop ro.serialno 查看机器的序列号 getprop ro.carrier 查看机器的CID号 getprop ro ...

  5. npm库下载缓慢解决方案

    淘宝针对国内下载npm库缓慢的问题,使用建立自己的cnpm库,可以很方便使用在公司内部使用. 地址:http://npm.taobao.org/ $ npm install -g cnpm --reg ...

  6. touches, targetTouches, changedTouches 区别

    1. touches: A list of information for every finger currently touching the screen2. targetTouches: Li ...

  7. jQuery multiselect的使用

    1,下载插件 https://github.com/ehynds/jquery-ui-multiselect-widget

  8. js手机号码和电话号码验证正则表达式

    /******************** 函数名称:IsTelephone 函数功能:固话,手机号码检查函数,合法返回true,反之,返回false 函数参数:obj,待检查的号码 检查规则: (1 ...

  9. laravel框架学习

    在聊技术之前,我们首先谈谈研究生的生活现状.进入到研究生忙碌的生活中,研究生是这么一个群体,外界对研究生的爱称是"研究僧",为什么我自己会觉得会是爱称.因为研究僧说的是研究生对自己 ...

  10. dma驱动

    http://www.crifan.com/files/doc/docbook/dma_pl08x_analysis/release/html/dma_pl08x_analysis.html#idp2 ...