认知:

对于多线程的作用,简单点就是把一项重复的任务分给多个渠道一起完成,这样就大大提高工作效率。

目前大多数使用线程用的都是threading模块,这模块对于现在来说我认为已经落后了,就拿爬虫来说,动不动就是处理百万千万级别的数据,处理那么大的数据量就需要控制线程的同步、等待、加锁等繁琐操作,这时,到python3就出现了线程池,解决了很多繁琐的操作。

这里我用到的模块是:concurrent.futures。

可以做到:

  1. 获取线程的运行状态和返回值。
  2. 不需要再加锁,内置可以控制线程的等待 。

话不多说,上代码:

示例:

submit:

使用submit函数来提交线程需要执行的任务(函数名和参数)到线程池中,并返回该任务的句柄(类似于文件、画图),注意submit()不是阻塞的,而是立即返回。

#-*- coding:utf-8 -*-
import time
from concurrent.futures import ThreadPoolExecutor
# 定义一个准备作为线程任务的函数
def task(k):for i in k:time.sleep(2)print(f"等待2s.执行:{i}")return k# 创建一个包含最多2条线程的线程池
pool = ThreadPoolExecutor(max_workers=2)
ks1=[1,2,3,4,5]
ks2=[6,7,8,9,10]
#通过submit函数提交执行的函数到线程池中,submit函数立即返回,不阻塞
future1=pool.submit(task,ks1)#线程1
future2=pool.submit(task,ks2)#线程2
#输出结果
print(f"future1:{future1.result()}")
print(f"future2:{future2.result()}")
# time.sleep(2)
# done方法用于判定某个任务是否完成
# print(future1.done())
# print(future2.done())
#关闭线程池
pool.shutdown()#输出结果
"""
等待2s.执行:6
等待2s.执行:1等待2s.执行:7
等待2s.执行:2等待2s.执行:8
等待2s.执行:3等待2s.执行:9
等待2s.执行:4等待2s.执行:5
等待2s.执行:10
future1:[1, 2, 3, 4, 5]
future2:[6, 7, 8, 9, 10]
"""

wait:

wait方法可以让主线程阻塞,直到满足设定的要求。

#-*- coding:utf-8 -*-
from concurrent.futures import ThreadPoolExecutor,wait,ALL_COMPLETED,FIRST_COMPLETED
import time
# 定义一个准备作为线程任务的函数
def action(i):time.sleep(2)print(i)return i*2# 创建一个包含2条线程的线程池
pool= ThreadPoolExecutor(max_workers=2)
lists=[1,2,3,4,5]
all_task=[pool.submit(action, (i)) for i in lists]
"""
return_whenALL_COMPLETED:表明要等待所有的任务都结束。or FIRST_COMPLETED:表示第一个任务完成就停止等待。
"""
wait(all_task, return_when=ALL_COMPLETED)
#返回结果值
result=[i.result() for i in all_task]
print(f"result:{result}")
pool.shutdown()#输出结果
"""
1
23
45
result:[2, 4, 6, 8, 10]
"""

map:

map方法与python标准库中的map含义相同,都是将序列中的每个元素都执行同一个函数。且输出结果于初始化lists的元素顺序相对应。

#-*- coding:utf-8 -*-
from concurrent.futures import ThreadPoolExecutor
import time
# 定义一个准备作为线程任务的函数
def action(i):time.sleep(2)print(i)return i*2# 创建一个包含5条线程的线程池
executor = ThreadPoolExecutor(max_workers=5)
lists=[1,2,3,4,5,7,8,9,10]
result=[data for data in executor.map(action, lists)]
print(result)
executor.shutdown()#输出结果:
"""
#休眠2s
3
4
5
1
2#休眠2s
7
10
8
9
[2, 4, 6, 8, 10, 14, 16, 18, 20]
"""

[Python3] 线程池的使用相关推荐

  1. python3 线程池 ThreadPoolExecutor 简介

    前言 从Python3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和ProcessPoolExecutor (进 ...

  2. python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现

    概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器 ...

  3. Python SSH爆破以及Python3线程池控制线程数

    源自一个朋友的要求,他的要求是只爆破一个ip,结果出来后就停止,如果是爆破多个,完全没必要停止,等他跑完就好 #!usr/bin/env python #!coding=utf-8__author__ ...

  4. python3 线程池监控线程是否停止工作_Python线程池——个人总结,如果你不喜欢就不要喷,勿...

    有bug,请在评论区留下你得真言,谢谢 concurrent.futures 包含线程池和进程池,目前只记录线程池 ThreadPoolExecutor的使用 小二,上代码~ from concurr ...

  5. python3线程池爬虫_python3爬虫中多线程的优势总结

    有些小伙伴跟小编讨论了python中使用多线程原理的问题,就聊到了关于python多线程的弊端问题,这点可能在使用的过程中大家会能感觉到.而且之前讲过的GIL也是对python多线程的一种限制.那么, ...

  6. python3线程池爬虫_python3多线程爬虫中如何变量?

    我们可以把待处理的程序看成一批需要配送的包裹,包裹在不同的货架上摆放.单人整理会比几个人一起摆放要慢的多.同样在计算机处理中,单凭借一个程序打开运行是远远不够用的,我们需要同时处理多个事物,所以多线程 ...

  7. Python3高并发定时更新任务进程池和线程池的使用

    Python3高并发定时更新任务进程池和线程池的使用 背景:需要定时对数据库的某一张表做更新 不管用多线程还是多进程只能利用当前一台机器的计算能力,可以考虑使用celery这样的工具,后期可以横向扩展 ...

  8. python3 信号量和线程池 semaphore ThreadPollExector

    信号量 其实本质上是锁,Lock是单锁,信号量是指定多把锁,也就是说通过信号量指定多个数线程可以访问相同资源,一般情况下读操作可以有多个,但写操作同时只有一个 信号量模块 semaphore 使用起来 ...

  9. python3 asyncio loop 使用线程池原理

    问题 根据官方描述,asyncio中的事件是属于单个线程的,下面这段程序中即属于main线程.但是为什么下面的ThreadPollExecutor(2)中的两个线程的能共享一个loop? 拜托大神解释 ...

最新文章

  1. 皮一皮:古老中医博大精深!
  2. Android-深入理解AIDL
  3. C#编译和运行过程图例
  4. Java 7:使用NIO.2进行文件过滤-第2部分
  5. c# .Net 缓存 使用System.Runtime.Caching 做缓存 平滑过期,绝对过期
  6. root 授予oracle权限,oracle – 列出具有root(管理)权限的用户
  7. 如何判断链表有环、如何判断两个链表相交
  8. 开辟 Dart 到 Native 的超级通道,饿了么跨平台的最佳实践
  9. PHP设计模式——中介者模式
  10. unity中Rotation * Position的意义
  11. category is in invalid format hint微信第三方平台将第三方提交的代码包提交审核出错...
  12. Atitit usrQBK13 html dsl 规范与解决方案
  13. Android应用保活方案的另类出路,让你应用长生不老,实战案例
  14. pringboot+校园健身互助平台 毕业设计-附源码221540S
  15. 开源网店系统Javashop 发布3.0beta版
  16. PX4日志读取并转化为.scv文件、MATLAB显示
  17. 初遇初识初知接下来是什么_娱乐圈隐藏学霸,演技零差评,张新成凭什么不火?...
  18. pinia使用与如何安装详解详细教程
  19. 微信文件撤回时间多长_微信中文件撤回时间延长至多久?
  20. nginx反向代理和正向代理

热门文章

  1. 一个电视剧男孩计算机专业的,杨紫新剧化身计算机天才,男主颜值爆表,又是一部爆款剧!...
  2. 上海工程技术大学计算机专硕,上海工程技术大学2019年硕士研究生调剂公告
  3. 【Java位运算】使用快速幂方法求指数的值
  4. Pinsker 不等式的简单证明
  5. 盘点丨一文了解DAO的现状
  6. P-NUCLEO-IHM001 电机开发套件(一)
  7. 3.东软跨境电商数仓项目架构设计
  8. 使用Process Explorer和Dependency Walker排查C++程序中dll库动态加载失败问题
  9. 老毛桃制作装机版u盘
  10. 基于 Springboot 的 Bark 通知辅助处理项目