python并发和并行,python高并发框架
Python concurrent.futures操作及前言嗨,你好,我是旋风。八周,我们知道。
无论是Java、C、Go还是Python,都有线程的概念。
但我知道,螺纹不是随便就能做的。每次招聘员工,都是有代价的。无限招聘最终会导致各种崩溃。
所以我们通常会引入线程池的概念。
本质上,我招了几个固定员工,给他们分配工作,等一个人下班后在任务中心拿到新工作。
任务太多,一下子招太多工人,最后防止系统崩溃。
快乐时刻,理想的多线程
实际多线程
可能是因为使用了fromconcurrent.futures导入…http://www.Sina.com/,从Python3.2开始,http://www。Sina.com/
可以,可以直接用。不需要Pip。
concurrent.futures下有两个主要接口.
线程池。ProcessPoolExecutor进程池。这里没有所谓的异步池。
线程池:异步性能高,但是目前的非Go实现不是很好。用起来有点奇怪。当然,你可以说我的食物。我承认。
线程池内置模块
ImportTimeFromCourrent。FutureSimportThreadPoolexecutorRandom # max _ workers表示工作线程的数量,即线程池中线程的数量pool=ttorkers任务列表task_list=[ task 1 , task 2 , Task 4 ,]simulate]def handler的任务执行时间的不确定性n=random . rand range(5)time . sleep(n)n)print(f)f)任务内容:(task_name)如果给函数,将所有任务提交到一个位置,线程池中的每个线程都来取任务比如线程池有三个线程,但是五个任务先取三个任务,每个线程处理自己的任务,然后在提交的任务区添加任务 pool.submit(Handler,)。
发现问题了。其实这是个人看法。请不要怀疑。但是,你发现问题了吗?3358www.Sina.com/跑第一。这是什么意思?
这说明我在示例代码跑了之后,就和执行结果的生死无关了。
能不能把并发,main的功能全部设置为运行?
当然要main。
Pool.shutdown))要解决上述问题,必须添加参数及其参数。
子线程之后可以是子线程都执行完之后。
main。if _ _ name _ _= _ _ main _ _: #遍历任务,对于task_list中的任务: 将其传递给函数,并逐个提交所有任务。首先获取三个任务,每个线程处理自己的任务,然后进入另一个任务的提交任务区域 pool.submit(Handler,task)
参数
这次的结果是我们想要的。hhh!
Add _ done _ callback Add _ done _ callback是主线程等待所有子线程执行完,线程主线程再执行完
执行后,将执行自动调用指定的回调函数。
并且可以拿到线程执行函数的返回值。
有什么用?我也没用过。我学习能力很差。
示例代码
从并发导入。期货导入线程池poolexecuturimport随机从并发。期货。_ baseimportfuture # max _ workers表示工作线程的数量,即线程池pool pool=threadpooleexecutor(max _ workers=10)# task list task _ list=[ task 1 , task 2 , task 3 ,]def handler(task _ name):# random sleep, 模仿任务执行时间的不确定性n=random . rand range(5)time . sleep(n)print(f 任务内容:{task_name}) return f 任务内容:{ Task _ name } def done(RES:future):print( done获得的返回值:,RES . result())if _ _ name _ _= _ _ main _ :#遍历任务,对于task _ list中的任务:futue=pool.submit (handler,Task)# type:future . add _ done _ callback(done)pool . shut down()
执行效果
我觉得可能平时用在一些善后工作的哔哔声里。
其实通过上面的例子,我们基本知道了上面的线程池的使用方法。
但是大家都知道Python的线程,因为GIL(全局解释器锁)的原因,是不能并发到多个在物理核上。
所以是IO密集型的,像爬虫一样读写文件,用线程池也是可以的。
但如果我是野人,我是傻逼,要用Python做计算应用,比如图像压缩,视频流推送,那就没办法了。我需要使用多进程池方法。
事实上,通过并发接口,你可以很容易地创建一个进程池,只需要修改两个地方。
.#从concurrent.futures导入进程池executor更改为导入进程池模式.if _ _ name _ _= _ _ main _ :#进程池模式pool=processpoolexecutor(max _ workers=10).只需要修改这两个地方,剩下的和上面的用法一模一样。
这个总结主要讲Python自己的线程池和进程池。
比较有特色的是ThreadPoolExecutor和ProcessPoolExecutor的接口是一样的。
只需修改导入的包即可。
并行接口主要有pool.submit(),pool.shutdown(),futue.add _ done _ callback()。
这些基本够我自己用了。
如果在操作过程中有什么问题,请在下面留言,我们会尽快解决问题。
为过去干杯,永不回头。
周一我是码农。如果我觉得不错,记得给个赞。
感谢您的观看。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。