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. Foundation ----->NSArray

    .数组的创建     //注意:在OC的数组中,只能够存放对象 //    NSArray *array = [NSArray arrayWithObject:12];错误          //创建 ...

  2. An exception occurred while acquiring a poolable resource. Will retry.

    我的是mysql-connector-java-5.1.20.jar加到lib下面就行了.或者在pom中加入配置也行.

  3. 《Benign and maligenant breast tumors classification based on region growing and CNN segmentation》翻译阅读与理解

    注明:本人英语水平有限,翻译不当之处,请以英文原版为准,不喜勿喷,另,本文翻译只限于学术交流,不涉及任何版权问题,若有不当侵权或其他任何除学术交流之外的问题,请留言本人,本人立刻删除,谢谢!! 另:欢 ...

  4. MAC系统生成RSA公钥私钥

    进入openssl然后主要就是三条命令: 1.genrsa -out rsa_private_key.pem 1024 这句是生成原始私钥文件 2.pkcs8 -topk8 -inform PEM - ...

  5. nagios二次开发(一)---开发思想

    NAGIOS现状   从nagios的官网http://www.nagios.org/及其它已经公开的资料,我们可以知道:在web UI层nagios只提供了给我们查看图形界面的操作,界面上有简单的启 ...

  6. svg绘制圆弧

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. kendo ui 富文本编辑控件 Editor 实现本地上传图片,并显示

    富文本编辑的组件有很多,大名鼎鼎的KENDO UI中自然也有,但是默认功能中,只能包含网络图片, 而如果要实现本地上传图片,KENDO UI也提供了相应的功能,但必须实现KENDO规定的多个接口, 而 ...

  8. VC++ 简单的打印功能(对话框模式下)

    不多说,直接上代码 void CParamDlg::OnBnClickedButton6() { // TODO: 在此添加控件通知处理程序代码 CDC dc; CPrintDialog dlg(TR ...

  9. [delphi]运行cmd命令,并取得输出字符

     http://blog.csdn.net/nerdy/article/details/8969189 [delphi]运行cmd命令,并取得输出字符 标签: delphiCMD命令 2013-05- ...

  10. 团队编程——web应用之人事管理系统

    本次作业为团队作业,团队博客要求如下:1. 介绍团队情况:包括队长.成员.队名.成员照片.队训--.等:2. 介绍团队项目名称.总体任务,各成员任务等:3. 每个队做 一次需求调研(针对团队项目),要 ...