爬天极网开哥讲线程池和进程池.py

#导入多线程模块:import threadingimport osimport requests  # 发送请求import timefrom bs4 import BeautifulSoup   # 解析文本#导入线程池执行器和进程池执行器:from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor#导入获取CPU的数量cpu_count模块的功能:from multiprocessing import cpu_countbase_path = os.path.dirname(os.path.abspath(__file__))img_path = os.path.join(base_path, ‘img‘)

def func(num):    #小f字符串拼接下:    response = requests.get(f‘http://pic.yesky.com/c/6_20491_{num}.shtml‘)    soup = BeautifulSoup(response.text, ‘html.parser‘)   # 将请求结果交给bs4解析    div_obj = soup.find(name=‘div‘, attrs={"class": "lb_box"})  # 经过分析之后,定位到指定div

    list_dd = div_obj.find_all(name=‘dd‘)    for dd in list_dd:  # 每一张图片的dl        a_obj = dd.find(‘a‘)        # 拼接文件夹的路径,并创建文件夹        dir_path = os.path.join(img_path, a_obj.text)        if not os.path.isdir(dir_path):  # 判断文件是否存在            os.mkdir(dir_path)        a_response = requests.get(a_obj.get(‘href‘))        a_response.encoding = ‘GBK‘        soup2 = BeautifulSoup(a_response.text, ‘html.parser‘)        div_obj2 = soup2.find(name=‘div‘, attrs={"class": "overview"})        # print(div_obj2)        print(response.url)        try:            img_list = div_obj2.find_all(name=‘img‘)            for img in img_list:                img_src = img.get("src")                img_response = requests.get(img_src.replace(‘113x113‘, ‘740x-‘))                file_path = os.path.join(dir_path, img_src.rsplit(‘/‘, 1)[-1])                with open(file_path, ‘wb‘) as f:                    f.write(img_response.content)        except Exception as e:            pass

if __name__ == ‘__main__‘:    #获取电脑CPU的数量:    # print(cpu_count())    #定义开始时间:    start = time.time()    #开当前电脑的cup核数的进程池:    # p = ProcessPoolExecutor(max_workers=cpu_count())    #循环5圈:    # for i in range(1,6):        #获取进程池并submit提交下:        # p.submit(func,i)    # p.shutdown()

    #开当前电脑的cup核数的线程池:    t = ThreadPoolExecutor(max_workers=cpu_count())    for i in range(1,6):        t.submit(func,i)    t.shutdown()    print("执行时间:{}".format(time.time() - start))

原文地址:https://www.cnblogs.com/zhang-da/p/12210152.html

时间: 2024-10-09 08:41:13

爬天极网开哥讲线程池和进程池.py的相关文章

多进程 multiprocessing 多线程Threading 线程池和进程池concurrent.futures

multiprocessing.procsess 定义一个函数 def func():pass 在if __name__=="__main__":中实例化 p = process(target=子进程要执行的函数,args(函数的参数且必须以元组的方式传参)) p.start() 开启子进程 p.join() 感知子进程的结束,主进程等待子进程执行完后才退出 p.terminate() 结束一个子进程 p.is_alive() 查看某个进程是否还在运行 属性 p.name p.pid

python第三十七天,GIL全局解释器锁*****,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe

GIL 线程池与进程池 同步与异步

1.GIL   全局解释器锁     只存在于cPython中,其他解释器中没有 释以:在cpython中它是一种互斥锁是为了防止多个线程在同一时间执行python字节码,这个锁是非常重要的,因为cpython的内存管理是非线程安全的,而且很多已经存在的代码需要依赖这个锁,所以即使它影响了程序效率也无法将其去除. 优点:保证了cpython中内存管理是线程安全的 缺点:使得多线程无法并行 注:非线程安全:多个线程访问统一个资源,会有问题: 线程安全:多个线程访问统一个资源,不会有问题,与之相反

5,线程池,进程池,协程,IO模型

今日内容: 1,线程池 2,进程池 3,协程 4,IO 模型 服务端要满足这三个条件: 1,24小时不间断的提供服务 2,能够支持高并发 3,要有固定的IP地址和端口在服务端这个地方会出现阻塞态情况: 阻塞IO 操作有: 1,链接循环 2,通信循环单线程实现高并发思路: 为了更好的提高程序的运行效率,即实现高并发,让服务端同时能够接受多个客户端的消息 所以一般在服务端会把,连接循环和通信循环封装为两个不同的函数方法, 这样当一个客户端与服务端进行通信时,服务端的连接循环可以和其他客户端进行连接,

内存池、进程池、线程池

首先介绍一个概念"池化技术 ".池化技术 一言以蔽之就是:提前保存大量的资源,以备不时之需以及重复使用. 池化技术应用广泛,如内存池,线程池,连接池等等.内存池相关的内容,建议看看Apache.Nginx等开源web服务器的内存池实现. 起因:由于在实际应用当中,分配内存.创建进程.线程都会设计到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作.           因此,当程序中需要频繁的进行内存申请释放,进程.线程创建销毁等操作时,通常会使用内存池.进程池.

开启线程池和进程池

线程与进程的应用场合很多,主要处理并发与多任务.然而,当开启的线程与进程过多时,系统的开销过多会造成性能低下甚至崩溃.这时,希望出现一种方法能规定只能执行指定数量线程与进程的策略.特别是针对不知道要开启多少线程或进程,而有可能出现线程或进程过多的情况.于是,线程池与进程池出现了.python3以后增加了concurrent.futures模块,为异步执行提供了高级的接口. 线程池 concurrent.futures.ThreadPoolExecutor(max_workers=None, th

第十五章、线程池和进程池

目录 第十五章.线程池和进程池 一.线程计时器 二.异步同步 三.线程池和进程池 第十五章.线程池和进程池 一.线程计时器 from threading import Timer,current_thread def task(x): print('%s run....' %x) print(current_thread().name) if __name__ == '__main__': t=Timer(3,task,args=(10,)) # 3s后执行该线程 t.start() print

线程池和进程池

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import os import time ''' 进程池与线程池 开进程开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少 在计算机能够承受范围之内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率 但是保证了计算机硬件的安全 (硬件的发展跟不上软件的速度) ''' # pool

GIL、定时器、线程queue、进程池和线程池

一.GIL1.什么是GIL(这是Cpython解释器) GIL本质就是一把互斥锁,那既然是互斥锁,原理都一样,都是让多个并发线程同一时间只能 有一个执行 即:有了GIL的存在,同一进程内的多个线程同一时刻只能有一个在运行,意味着在Cpython中 一个进程下的多个线程无法实现并行===>意味着无法利用多核优势 但不影响并发的实现 GIL可以被比喻成执行权限,同一进程下的所以线程 要想执行都需要先抢执行权限 2.为何要有GIL 因为Cpython解释器自带垃圾回收机制不是线程安全的(对共享数据修改