Python多线程开发简介
Python的并发程序可以使用multiprocessing库、threading库、asyncio库、concurrent.futures库以及selectors库等等协助编写:
- multiprocessing库可以创建多个进程,由系统协调调度各个任务;
- threading库则是创建多个线程,由Python解释器在一条进程内并发执行任务,始终只占用一个CPU核心资源,会遇到臭名昭著的GIL问题;
- asyncio库则是将任务中的IO密集部分单拎出来,系统可以在等待IO密集部分返回的同时多次执行计算密集代码,所有任务都在一条线程内执行;
- concurrent.futures库可以用来创建线程池或进程池,更适合编写粒度较细的并发任务代码。
- selectors库是对select库的高级封装;而后者则是对Unix的select、poll、Linux的epoll、BSD的Kqueue等等IO复用方法的低级封装库。
multiprocessing库、threading库、asyncio库的有着类似的同步条件:Lock、RLock、Condition、Semaphore、Barrier、Event等:
- Lock、RLock较为类似,可以用来将一组操作原子化。RLock的特殊之处在于,可以被同一条线程递归调用,当然用完之后也得递归解锁。
- Condition可以保证多组线程阻塞在同一位置,等候其他线程的通知,防止因为资源为空时发生错误。
- Semaphore用于确保不会有过多线程同时访问某一资源。
- Barrier则用于保证所有线程各自在某一位置阻塞,当所有线程都阻塞时,又各自开始执行下一条指令。
- 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多线程开发简介的更多相关文章
- 【学习笔记】第一章 python安全开发简介
1.1为什么黑客喜欢用python? python为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量内容,被形象的称为“”内置电池“”,用python开发,许多功能不必从零 ...
- Python自动化开发-简介
1.Python简介 Python创始人 Guido Van Rossum,人称"龟叔",1989年圣诞节期间,为了在阿姆斯特丹打发时间,开发的一个新的脚本解释程序 作为ABC语 ...
- python 多进程开发与多线程开发
转自: http://tchuairen.blog.51cto.com/3848118/1720965 博文作者参考的博文: 博文1 博文2 我们先来了解什么是进程? 程序并不能单独运行,只有将程 ...
- Python Web开发中的WSGI协议简介
在Python Web开发中,我们一般使用Flask.Django等web框架来开发应用程序,生产环境中将应用部署到Apache.Nginx等web服务器时,还需要uWSGI或者Gunicorn.一个 ...
- Python多线程问题的资料查找与汇总
Python多线程问题的资料查找与汇总 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系作者bitpea ...
- python自动化开发学习 I/O多路复用
python自动化开发学习 I/O多路复用 一. 简介 socketserver在内部是由I/O多路复用,多线程和多进程,实现了并发通信.IO多路复用的系统消耗很小. IO多路复用底层就是监听so ...
- python多线程+生产者和消费者模型+queue使用
多线程简介 多线程:在一个进程内部,要同时干很多事情,就需要同时执行多个子任务,我们把进程内的这些子任务叫线程. 线程的内存空间是共享的,每个线程都共享同一个进程的资源 模块: 1._thread模块 ...
- 《Python Web开发实战》|百度网盘免费下载|Python Web开发
<Python Web开发实战>|百度网盘免费下载|Python Web开发 提取码:rnz4 内容简介 这本书涵盖了Web开发的方方面面,可以分为如下部分: 1. 使用最新的Flask ...
- iOS多线程开发
概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...
随机推荐
- Json的序列化与反序列化
对于Json的序列化和反序列化,如果自己编写源代码来实现的话,很复杂很烦,所以我采用的是使用别人已经写好的引用文件.这类文件网上有很多,我用的是LitJson,当然Newtonsoft也可以,但后者需 ...
- [HTML]JS全屏代码
video全屏参考:https://www.thecssninja.com/javascript/fullscreen <!doctype html> <html> <h ...
- OpenCV Template Matching Subpixel Accuracy
OpenCV has function matchTemplate to easily do the template matching. But its accuracy can only reac ...
- RedHat6.5更新软件源
今天在Red Hat上安装软件时,发现需要依赖软件,然而在用sudo yum指令时,出现了下面的错误: This system is not registered to Red Hat Subscri ...
- GridView 使用方法总结
http://www.cnblogs.com/sufei/archive/2010/03/27/1698590.html 地址
- make[2]: *** No rule to make target `/root/.pyenv/versions/anaconda3-2.4.0/lib/libpython3.5m.so', needed by `evaluation.so'. Stop.
当出现No rule to make target ,肯定是Makefile有问题. 有的makefile是脚本生成的,你得看脚本的配置文件对不对. 我的是这个脚本生成的.发现是Pythondir的配 ...
- Hibernate和Struts2整合的增、删、改、查
1. 新建一个Web项目,准备好jar包和配置文件. 2. web.xml文件中添加过滤器 <?xml version="1.0" encoding="UTF-8& ...
- 基本TCP套接字编程
1.listen函数 将主动套接字转换成一个被动套接字 backlog指定相应套接字连接队列的大小. 监听套接字有2个队列: (1)未完成连接队列,接收客户SYN,发出SYN.ACK,等待完成三次握手 ...
- BZOJ1093 [ZJOI2007]最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- python之路-Day11
引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程: ...