iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python基于concurrent模块实现多线程
  • 733
分享到

python基于concurrent模块实现多线程

2024-04-02 19:04:59 733人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录引言       操作多线程/多进程 1、创建线程池 2、submit 3、map 4、wait 5、异常处理 引言&

引言      

  之前也写过多线程的博客,用的是 threading ,今天来讲下 python 的另外一个自带库 concurrent 。concurrent 是在 python3.2 中引入的,只用几行代码就可以编写出线程池/进程池,并且计算型任务效率和 mutiprocessing.pool 提供的 poll 和 ThreadPoll 相比不分伯仲,而且在 io 型任务由于引入了 Future 的概念效率要高数倍。而 threading 的话还要自己维护相关的队列防止死,代码的可读性也会下降,相反 concurrent 提供的线程池却非常的便捷,不用自己操心死锁以及编写线程池代码,由于异步的概念 IO 型任务也更有优势。

  concurrent 的确很好用,主要提供了 ThreadPoolExecutor 和 ProcessPoolExecutor 。一个多线程,一个多进程。但 concurrent 本质上都是对 threading 和 mutiprocessing 的封装。看它的源码可以知道,所以最底层并没有异步。
ThreadPoolExecutor 自己提供了任务队列,不需要自己写了。而所谓的线程池,它只是简单的比较当前的 threads 数量和定义的 max_workers 的大小,小于 max_workers 就允许任务创建线程执行任务。

操作多线程/多进程

1、创建线程池

通过 ThreadPoolExecutor 类创建线程池对象,max_workers 设置最大运行线程数数。使用 ThreadPoolExecutor 的好处是不用担心线程死锁问题,让多线程编程更简洁。


from concurrent import futures

pool = futures.ThreadPoolExecutor(max_workers = 2)

2、submit

submit(self, fn, *args, **kwargs):

  • fn:需要异步执行的函数
  • *args,**kwargs:fn 接受的参数

 该方法的作用就是提交一个可执行的回调task,它返回一个Future对象。可以看出此方法不会阻塞主线程的执行。


import requests,datetime,time
from concurrent import futures

def get_request(url):
    r = requests.get(url)
    print('{}:{}  {}'.fORMat(datetime.datetime.now(),url,r.status_code))

urls = ['https://www.baidu.com','Https://www.tmall.com','https://www.jd.com']
pool = futures.ThreadPoolExecutor(max_workers = 2)
for url in urls:
    task = pool.submit(get_request,url)
print('{}主线程'.format(datetime.datetime.now()))
time.sleep(2)


# 输出结果
2021-03-12 15:29:10.780141:主线程
2021-03-12 15:29:10.865425:https://www.baidu.com  200
2021-03-12 15:29:10.923062:https://www.tmall.com  200
2021-03-12 15:29:10.940930:https://www.jd.com  200

3、map

map(self, fn, *iterables, timeout=None, chunksize=1):

  • fn:需要异步执行的函数
  • *iterables:可迭代对象

map 第二个参数是可迭代对象,比如 list、tuple 等,写法相对简单。map 方法也不会阻塞主线程的执行。


import requests,datetime,time
from concurrent import futures



def get_request(url):
    r = requests.get(url)
    print('{}:{}  {}'.format(datetime.datetime.now(),url,r.status_code))

urls = ['https://www.baidu.com','https://www.tmall.com','https://www.jd.com']
pool = futures.ThreadPoolExecutor(max_workers = 2)
tasks = pool.map(get_request,urls)
print('{}:主线程'.format(datetime.datetime.now()))
time.sleep(2)


# 输出结果
2021-03-12 16:14:04.854452:主线程
2021-03-12 16:14:04.938870:https://www.baidu.com  200
2021-03-12 16:14:05.033849:https://www.jd.com  200
2021-03-12 16:14:05.048952:https://www.tmall.com  200

4、wait

如果要等待子线程执行完之后再执行主线程要怎么办呢,可以通过 wait 。

wait(fs, timeout=None, return_when=ALL_COMPLETED):

  • fs:所有任务 tasks
  • return_when:有三个参数 FIRST_COMPLETED:只要有一个子线程完成则返回结果。 FIRST_EXCEPTION:只要有一个子线程抛异常则返回结果,若没有异常则等同于ALL_COMPLETED。 ALL_COMPLETED:默认参数,等待所有子线程完成。

import requests,datetime,time
from concurrent import futures


def get_request(url):
    r = requests.get(url)
    print('{}:{}  {}'.format(datetime.datetime.now(),url,r.status_code))

urls = ['https://www.baidu.com','https://www.tmall.com','https://www.jd.com']
pool = futures.ThreadPoolExecutor(max_workers = 2)
tasks =[]
for url in urls:
    task = pool.submit(get_request,url)
    tasks.append(task)
futures.wait(tasks)
print('{}:主线程'.format(datetime.datetime.now()))
time.sleep(2)


# 输出结果
2021-03-12 16:30:13.437042:https://www.baidu.com  200
2021-03-12 16:30:13.552700:https://www.jd.com  200
2021-03-12 16:30:14.117325:https://www.tmall.com  200
2021-03-12 16:30:14.118284:主线程

5、异常处理

as_completed(fs, timeout=None)

  • 所有任务 tasks

使用 concurrent.futures 操作 多线程/多进程 过程中,很多函数报错并不会直接终止程序,而是什么都没发生。使用 as_completed 可以捕获异常,代码如下


import requests,datetime,time
from concurrent import futures

def get_request(url):
    r = requests.get(url)
    print('{}:{}  {}'.format(datetime.datetime.now(),url,r.status_code))

urls = ['www.baidu.com','https://www.tmall.com','https://www.jd.com']
# 创建线程池
pool = futures.ThreadPoolExecutor(max_workers = 2)
tasks =[]
for url in urls:
    task = pool.submit(get_request,url)
    tasks.append(task)
# 异常捕获 
errors = futures.as_completed(tasks)
for error in errors:
    # error.result()       等待子线程都完成,并抛出异常,中断主线程
    # 捕获子线程异常,不会终止主线程继续运行
    print(error.exception())
futures.wait(tasks)
print('{}:主线程'.format(datetime.datetime.now()))
time.sleep(2)


# 输出结果
Invalid URL 'www.baidu.com': No schema supplied. Perhaps you meant http://www.baidu.com?
2021-03-12 17:24:26.984933:https://www.tmall.com  200
None
2021-03-12 17:24:26.993939:https://www.jd.com  200
None
2021-03-12 17:24:26.994937:主线程

多进程编程也类似,将 ThreadPoolExecutor 替换成 ProcessPoolExecutor 。

以上就是Python基于concurrent模块实现多线程的详细内容,更多关于python concurrent实现多线程的资料请关注编程网其它相关文章!

--结束END--

本文标题: python基于concurrent模块实现多线程

本文链接: https://www.lsjlt.com/news/123802.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python基于concurrent模块实现多线程
    目录引言       操作多线程/多进程 1、创建线程池 2、submit 3、map 4、wait 5、异常处理 引言&...
    99+
    2024-04-02
  • python中thread模块实现多线程
    这篇文章将为大家详细讲解有关python中thread模块实现多线程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pyt...
    99+
    2023-06-14
  • python thread模块怎么实现多线程
    这篇文章主要介绍“python thread模块怎么实现多线程”,在日常操作中,相信很多人在python thread模块怎么实现多线程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python thread...
    99+
    2023-06-30
  • python 多线程模块threadpo
      python实现线程池通常使用threading或thread模块来编写,现在已经有了threadpool模块来实现线程池。英文文档见:http://www.chrisarndt.de/projects/threadpool/中文文档见...
    99+
    2023-01-31
    多线程 模块 python
  • Python 多线程之 threading 模块
    在之前的文章中,我们已经介绍了 Python 通过 _thread 和 threading 模块提供了对多线程的支持,threading 模块兼具了 _thread 模块的现有功能,又扩展了一些新的功能,具有十分丰富的线程操作功能,本节我们...
    99+
    2023-09-16
    python 开发语言 java
  • 基于Python多元线性回归模型
    提示:基于Python的多元线性回归模型 文章目录 前言 一、读取数据 二、建立模型  三、预测新值  四、去截距模型 总结 前言 本文主要是基于多元回归线性模型,然后建立模型和分析,解决多元线性回归模型存在的问题...
    99+
    2023-10-24
    python pandas
  • Python threading和Thread模块及线程的实现
    目录前言1. 线程1.1 线程模块1.1.1 Thread类1.2 创建线程1.2.1 实例Thread类法创建线程1.2.1 继承重写Thread类法创建线程1.3 Join &a...
    99+
    2024-04-02
  • Python多线程编程之threading模块详解
    目录一、介绍二、Python如何创建线程2.1 方法一:2.2 方法二:三、线程的用法3.1 确定当前的线程3.2 守护线程3.3 控制资源访问一、介绍 线程是什么?线程有啥用?线程...
    99+
    2024-04-02
  • Python 多线程之threading 模块的使用
    目录简介 创建线程 构造器方式 继承方式 守护线程 线程本地数据 定时器 简介 Python 通过 _thread 和 threading 模块提供了对多线程的支持,threadi...
    99+
    2024-04-02
  • 基于C#实现端口扫描器(单线程和多线程)
    目录一、新建项目并设置界面二、单线程实现端口扫描1. 编写代码2. 运行结果三、多线程实现端口扫描1. 编写代码2. 运行结果四、总结一、新建项目并设置界面 新建项目: 选择Wind...
    99+
    2024-04-02
  • Python多线程中Queue模块怎么用
    这篇文章将为大家详细讲解有关Python多线程中Queue模块怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。queue介绍queue是python中的标准库,俗称队列,可以直接import 引用,在...
    99+
    2023-06-20
  • 基于jQuery模拟实现淘宝购物车模块
    这是网页版淘宝中购物车的页面 注意给checkbox添加事件就是用change() 给button添加事件就是用click() 1、每次点击+号,根据文本框的值乘以当前商品的价格就...
    99+
    2024-04-02
  • C++基于socket多线程实现网络聊天室
    本文实例为大家分享了C++基于socket多线程实现网络聊天室的具体代码,供大家参考,具体内容如下 1. 实现图解 2. 聊天室服务端:TCP_Server_Chat.cpp ...
    99+
    2024-04-02
  • Python中线程池模块之多线程的示例分析
    这篇文章将为大家详细讲解有关Python中线程池模块之多线程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、线程池模块引入from concurrent.futures i...
    99+
    2023-06-15
  • python多线程基础
    一、python多线程基础    python多线程主要涉及两个类:thread和threading,后者实际是对前者的封装,由于threading提供了更完善的锁机制,运用场景更多,重点学习了这个类的使用。threading.Thread...
    99+
    2023-01-31
    多线程 基础 python
  • subprocess—Python多进程模块
    subprocess—Python多进程模块 1.概述 这篇文章介绍并行运算中的subprocess模块,subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取...
    99+
    2023-09-03
    python linux 运维
  • Python 多线程threading模
            首先,我们在了解多线程时需要理解的就是什么是多线程,按照官方的解释就是:多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。    在我自学到这里的时候,通过会在想进程和线程到底是有...
    99+
    2023-01-31
    多线程 Python threading
  • 基于jQuery如何模拟实现淘宝购物车模块
    小编给大家分享一下基于jQuery如何模拟实现淘宝购物车模块,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!这是网页版淘宝中购物车的页面注意给checkbox添加事件就是用change()给button添加事件就是用clic...
    99+
    2023-06-29
  • Python多线程实现模拟火车站售票
    本文实例为大家分享了Python多线程模拟火车站售票的具体代码,供大家参考,具体内容如下 Python的标准库提供了两个模块:thread和threading,thread是低级模块...
    99+
    2024-04-02
  • Python 常用模块threading和Thread模块之线程池
    目录1. 池的概念2. 自定义线程池3. 使用Python内置线程池4. 池的其他操作1. 池的概念 主线程: 相当于生产者,只管向线程池提交任务。 并不关心线程池是如何执行任务的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作