python------线程池的应用

这篇具有很好参考价值的文章主要介绍了python------线程池的应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在python中经常会使用异步,线程池,进程池,解决io操作,在爬虫中并不建议使用进程池(消耗过大)

目标:会使用线程池

1:导入

import time

def demo1():
    for i in range(3):
        print(f"我饿了{i}")
        time.sleep(1)

def demo2():
    for i in range(3):
        print(f"开饭了{i}")
        time.sleep(1)

if __name__ == "__main__":
    start=time.time()
    demo1()
    demo2()
    end=time.time()
    print(end-start)

#结果为
我饿了0
我饿了1
我饿了2
开饭了0
开饭了1
开饭了2
6.034951686859131

我们可以看到了只有在demo1完全运行完毕才会运行demo2,这个时候是单任务

2:基本使用方法

#1:导入threading模块
import threading
#2:使用threading模块中的Thread创建一个对象
t1=threading.Thread(target=xx)#xx为函数的名字
#3:调用这个实例对象的start方法让这个线程开始运行
t1.start()
import time
import threading
def demo1():
    for i in range(3):
        print(f"我饿了{i}")
        time.sleep(1)

def demo2():
    for i in range(3):
        print(f"开饭了{i}")
        time.sleep(1)

if __name__ == "__main__":
    start=time.time()
    t1=threading.Thread(target=demo1)
    t2 = threading.Thread(target=demo2)
    t1.start()
    t2.start()
    demo2()
    end=time.time()
    print(end-start)

#结果为:
我饿了0
开饭了0开饭了0

开饭了1开饭了1
我饿了1

开饭了2
开饭了2我饿了2

3.0304412841796875

我们可以看到这时候2个线程的一起跑

3:线程池的基本使用步骤

#1:导入包
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
#ThreadPoolExecutor线程池ProcessPoolExecutor进程池
def asd(data):
    print(data)
#2:在线程池中创建几个线程
pool=ThreadPoolExecutor(10)#创建10个线程
#3:在线程池中发任务
for i in range(100):
    pool.submit(asd,i)
#4:等待线程池把任务都执行完毕
pool.shutdown()
print("完毕")

 4:在实际爬虫中的简单应用

爬取网站的所以图片

from concurrent.futures import ThreadPoolExecutor
import requests
import os
def tupian(page):
 data = {
        'per_page': '12',
        'page': page,
        'seo_tags': 'true'
    }..........
#这个函数是获取每张图片的id
def downlong(id):
  
#这个函数是下载图片
def run():
    pool=ThreadPoolExecutor(13)
    a = int(input("请输入爬取的页数(大与3):"))
    for page in range(3, a + 1):
        id_list = tupian(page)
        for id in id_list:
            pool.submit(downlong,id)
    pool.shutdown()
    print("完毕")


#主要看怎么使用,函数就不给大家了

爬取菜价

import csv
from  concurrent.futures import ThreadPoolExecutor
import requests
with open('北京新发地菜价.csv',mode='w', encoding='utf-8',newline='.0') as f:
    wirter = csv.writer(f)#创建一个写入的对象
    wirter.writerow(['菜名', '最低价(元)', '最高价(元)', '平均价(元)', '产地','发布日期'])
    def get_one_page(pageNo):
        data={
            "limit":20,
            "current":pageNo
     #...........
    if __name__ == '__main__':
        # get_one_page(1)
        with ThreadPoolExecutor(100) as t:#创建10000个线程
            for i in range(1,22):#所有页数
                t.submit(get_one_page,pageNo=i)#接任务
        t.shutdown()
        print('over!')

刷播放文章来源地址https://www.toymoban.com/news/detail-553034.html

import ctypes
import execjs
import time
from urllib.parse import urlparse, parse_qs
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import binascii
import requests
import datetime
from concurrent.futures import ThreadPoolExecutor
asd = execjs.compile("""
  function ab () {
   var e= (new Date).getTime().toString(36)
   var t= Math.random().toString(36).replace(/^0./, "");
   return "" .concat(e, "_").concat(t)  //concat:相当于连接
}
""")

def aes_encrypt(data):
  


def creat_qn(data_str):
 
def creat_ckey(vid, rnd, guid, appVer, padtform):
  


def playvinfo_seconed(vid, rnd, appVer, padtform, flowid, guid, ckey):
   
        
  

def play_first(video_url, vid, pid, guid, fn, vkey, padtform, rnd, appver):
   

def run(video_url):
   


if __name__ == "__main__":
    pool=ThreadPoolExecutor(10)#在线程池中创建10个线程
    video_url = "https://w.yangshipin.cn/video?type=0&vid=u000058lp0z&ptag=yangshipincp"
    for i in range(1,10):
        pool.submit(run,video_url)
        print(f"增加{i}个播放量")
    # 等待线程池把任务都执行完毕
    pool.shutdown()
    print("完毕")

到了这里,关于python------线程池的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 聊聊线程池的预热

    本文主要研究一下线程池的预热 java/util/concurrent/ThreadPoolExecutor.java ThreadPoolExecutor定义了prestartCoreThread,用于启动一个核心线程 java/util/concurrent/ThreadPoolExecutor.java prestartAllCoreThreads用于启动所有的核心线程 ThreadPoolExecutor提供了prestartCoreThread方法,用于启动一个核心线程,提供了

    2024年02月08日
    浏览(29)
  • 线程池的执行流程

    如果所示,就是线程池的执行过程,可以分为三个主要步骤: 1.提交任务后会首先进行当前工作线程数与核心线程数的比较,如果当前工作线程数小于核心线程数,则直接调用 addWorker() 方法创建一个核心线程去执行任务; 2.如果工作线程数大于核心线程数,即线程池核心线程

    2023年04月09日
    浏览(28)
  • Java线程池的入门

    一、线程池的优势 1.降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗。 2.提高系统相应速度,当有任务到达时,通过复用已存在的行程,无需等待新线程的创建便能立刻执行。 3.方便线程并发数的管控,因为线程若是无限制创建,可能会导致内存

    2024年02月08日
    浏览(36)
  • 线程池的五种状态

    1、RUNNING 状态说明:线程池处于RUNNING状态时,能够接收新任务以及对已添加的任务进行处理。 状态切换:线程池的初始状态为RUNNING。换句话说线程池一旦被创建,就处于RUNNING状态,且线程池中的任务数为0 2、SHUTDOWN 状态说明:线程池处于SHUTDOWN状态时,不接收新任务,但能

    2023年04月09日
    浏览(64)
  • Java多线程之线程池的参数和配置

    在Java多线程编程中,线程池是一种常见的技术,用于管理线程的创建和销毁。线程池中的线程可以被重复利用,从而减少了线程的创建和销毁的开销,提高了程序的性能。在Java中,线程池的参数和配置非常重要,不同的参数和配置会影响线程池的性能和行为。 Java线程池的主

    2024年02月16日
    浏览(28)
  • SpringBoot线程池和Java线程池的实现原理

    @ 目录 使用默认的线程池 方式一:通过 @Async 注解调用 方式二:直接注入 ThreadPoolTaskExecutor 线程池默认配置信息 SpringBoot 线程池的实现原理 覆盖默认的线程池 管理多个线程池 JAVA常用的四种线程池 newCachedThreadPool newFixedThreadPool newScheduledThreadPool newSingleThreadExecutor Java 线程池中

    2023年04月11日
    浏览(36)
  • android中线程池的选择

    线程池是把一个或多个线程通过统一的方式进行调度和重复使用的技术。 避免了因为线程过多而带来使用上的开销。 在安卓开发中,为了更好的性能体验,我们在选择线程池的时候,需要从具体需求来考虑,主要考虑以下几方面: 1、从任务的优先级; 2、任务的执行时间长

    2023年04月23日
    浏览(33)
  • JAVA基础:线程池的使用

    目录 1.概述 2.线程池的优势​​​​​​​ 2.1.线程池为什么使用自定义方式? 2.2.封装的线程池工具类有什么好处? 3.线程池的七大参数 3.线程池的创建 3.1. 固定数量的线程池 3.2. 带缓存的线程池 3.3. 执⾏定时任务 3.4. 定时任务单线程 3.5. 单线程线程池 3.6. 根据当前CPU⽣成线

    2024年02月11日
    浏览(28)
  • Springboot结合线程池的使用

    配置文件 配置类 方式一:线程池结合CompletableFuture来实现 配置线程池类 CompletableFuture使用线程池进行调用 任务类 方式二:使用@EnableAsync和@Async方式实现 在启动类上加@EnableAsync注解 编写线程池配置 使用 任务类 方式三:重写springboot默认的线程池配置 在启动类上加@EnableAsy

    2024年02月01日
    浏览(45)
  • Qt 中线程池的使用

    我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 那么有没有一种办

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包