首页 > 其他分享 >线程池

线程池

时间:2023-08-28 16:55:30浏览次数:24  
标签:__ thread text 线程 executor ThreadPoolExecutor

python3多线程有threading,很好的支持了多线程,那么问题来了,为什么还需要线程池呢,其实很好回答,如果你要爬取网站有八百页,每页设置一个线程,难道能开启八百个么,光切换的时间也很高了吧。这时候就需要用到线程池,可以设置一个20的线程池,同时只有20个线程在运行,剩下的排队。

线程池模块

在threading中是没有线程池相关功能的,想要运行线程池需要自己重写,很明显像我这么懒不可能重写,而且自己编写线程池很难写的比较完美,还需要考虑复杂情况下的线程同步,很容易发生死锁。所以就用到了这个模块,

from concurrent.futures import ThreadPoolExecutor

 

从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象(线程池和进程池的唯一区别就是线程与进程,使用方法,内置函数等都完全一样),可以帮我们自动调度线程,省下大量时间

def thread_text(i,y):
    time.sleep(i+y)
    return i+y
if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=5)  # max_workers :设置进程池中线程数量
    executor1 = executor.submit(thread_text, 1,1)  # 和线程不同,进程池传参,不用以元组形式。进程池如果需要传递多个参数,只需要按照参数位置跟在后面即可
    executor2 = executor.submit(thread_text, 2,1)
    executor.shutdown()  # 关闭线程池

首先需要实例化,然后在实例化的同时设置最大线程数,然后使用submit提交线程就ok啦,而且与threading.Thread 的线程不同的是,线程池不阻塞,立即执行,也就是说,不需要start来启动它,

知识点一:线程池不阻塞,不需要start
而且想必有些同学已经看出我这个例子的常规例子的不同了,那就是我传了两个参数,这里也是为了区别threading.Thread的参数,众所周知,threading模块对方法传入参数是以元组的形式,比如我上面写的方法,如果用threading调用的话应该这么写threading.Thread(target=thread_text,args=(1,1)),而线程池则不是,如果翻过源码会发现ThreadPoolExecutor没有固定参数,只有*args和**kwargs,所以,线程池如果要传入多个参数,只需要按照参数位置跟在后面即可。

知识点二:线程池传参不要元组,接着往后写,有多少写多少

介绍一下其他几个常用功能函数:

wait 函数  :等待线程任务完成

 

wait(executor1, executor2)

 

result 函数 : 获取每个任务的结果
from concurrent.futures import ThreadPoolExecutor,as_completed
import time

def thread_text(i,y):
    time.sleep(i+y)
    return i+y
if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=5)
    executor1 = executor.submit(thread_text, 1, 1)
    executor2 = executor.submit(thread_text, 2, 1)
    executor.shutdown()
    print(executor1.result())  
    print(executor2.result())

 

 as_completed:上面虽然提供了判断任务是否结束的方法,但是不能在主线程中一直判断啊。有时候我们是得知某个任务结束了,就去获取结果,而不是一直判断每个任务有没有结束。这是就可以使用as_completed方法一次取出所有任务的结果。

from concurrent.futures import ThreadPoolExecutor,as_completed
def thread_text(i,y):
    time.sleep(i+y)
    return i+y
if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=5)
    executor1 = executor.submit(thread_text, 1,1)
    executor2 = executor.submit(thread_text, 2,1)
    for i in as_completed([executor1,executor2]):
        print(i.result())
    executor.shutdown()

 

 

 

一个demo示例:

pool = ThreadPoolExecutor(max_workers=4)  # 创建线程池
resultlist = [pool.submit(address.distance_caculate, cou, i) for i in list1]  # list1任务列表,通过for 循环向线程池中提交任务
wait(resultlist)  # 等待任务完成
new_list = [i.result() for i in resultlist]  # 使用 .result() 方法获取每个任务的结果

 





原文链接:https://blog.csdn.net/weixin_45621200/article/details/123849354

标签:__,thread,text,线程,executor,ThreadPoolExecutor
From: https://www.cnblogs.com/xujunhui/p/17662786.html

相关文章

  • 集合遍历使用多线程并行执行
    在业务中常常有这样的需求,需要遍历集合,分别处理,相互之前单独处理,互不影响。为了充分利用服务器资源,可以使用多线程来执行。parallelStream创建一个并行流,使用ConcurrentHashMap使多线程情况下线程安全CompletableFuture.allOf是所有线程全部执行完获得结果CompletableFuture.......
  • Java多线程-实现 生产者-消费者 模式
    多线程实现生产者消费者,堆积满100后停止生产,消费到小于50后继续生产这是一种写法,但是我觉得不太好:它通过循环创建了很多的线程,每个线程只消费/生产一次它使用notifyAll()通知所有的线程唤醒,包括生产者和消费者,感觉产品数量永远也达不到50publicclassProducerimpleme......
  • 多线程以rtsp流调用多路海康摄像头的思考
    如题,我使用了多线程,以rtsp流调用多路海康摄像头。使用了opencv作为拉流库,但是结果不如人意。当摄像头数增加时,cpu占用率变化不大,但是却出现了卡顿。当增大到5个时,甚至发生崩溃。我使用了千兆光纤网,显然不是带宽问题。那会不会是imshwo显示久了不更新呢,显然不是。接受速度快于显......
  • 【校招VIP】java语言考点之多线程&NIO
    考点介绍:多线程&NIO考点是校招面试中的常制点之一。JavaNIO是newIO的简称,是一种可以替代Java10的一套新的IO机制。它提供了一套不同于Java标准1O的操作机制,严格来说,NIO与并发并无直接关系,但是使用NIO技术可以大大提高线程的使用效率......答案详情解析和文章内容可扫下方二维......
  • 深入理解操作系统中进程与线程的区别及切换机制(上)
    进程所谓进程,大家可以理解为我们打开的应用程序,如微信、QQ、游戏等,但也有系统应用是我们看不见的,可以打开任务管理器一探究竟,我们写的代码程序在服务器上在不运行的情况下,它就是一个二进制文件,并不是进程!一个进程可以包含一个或者多个线程,但对于CPU来说他就是一个任务而已;在......
  • 在 Spring 6 中使用虚拟线程
    一、简介在这个简短的教程中,我们将了解如何在SpringBoot应用程序中利用虚拟线程的强大功能。虚拟线程是Java19的预览功能,这意味着它们将在未来12个月内包含在官方JDK版本中。Spring6版本最初由ProjectLoom引入,为开发人员提供了开始尝试这一出色功能的选项。首先,......
  • Linux 多线程基础
    @TOC前言一、多线程基础函数1.pthread_create创建新的线程。#include<pthread.h> intpthread_create(pthread_t*thread,constpthread_attr_t*attr, void*(*start_routine)(void*),void*arg);参数说明:thread:用于存储新线程的ID。attr:线程属......
  • 多线程基础
    进程在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程。某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,我们把子任务称为线程。进程和线程的关系:一个进程可以包含一个或多个线程,但至少会有一个......
  • 线程安全的集合
    目录多线程环境下使用Dictionary产生的问题何时使用线程安全集合解决办法相关参考.NET中的Dictionary是非线程安全的,在多线程环境中可能会导致CPU使用率为100%。多线程环境下使用Dictionary产生的问题关于C#中Dictionary多线程情况下CPU100%问题的详细分析关于C#的Dictionar......
  • 创建多线程继承Thread和实现Runnable以及synchronized的注意事项
    关于创建多线程继承Thread和实现Runnable以及synchronized的注意事项以下是利用多线程模拟购票的代码publicclassSell{publicstaticvoidmain(String[]args){Ticketticket=newTicket();Ticketticket1=newTicket();ticket.star......