学习总结week5_5线程池和指令

python- 线程池和指令

1. 线程的阻塞

子线程对象.join() - 阻塞当前线程知道指定子线程若任务完成

from time import sleep
from datetime import datetime
from threading import Thread
from random import randint
def download(name):
    print(f'{name}下载开始{datetime.now()}')
    sleep(randint(2, 7))
    print(f'{name}下载完成{datetime.now()}')


if __name__ == '__main__':
    t1 = Thread(target=download, args=('123',))
    t2 = Thread(target=download, args=('456',))
    t3 = Thread(target=download, args=('789',))

    t1.start()
    t2.start()
    t3.start()

    t1.join()
    t2.join()
    t3.join()
    print('全部完成')
2.线程池 - 管理多个线程的工具

线程池工作原理:提前创建指定个数的线程,添加多个任务(任务>线程),
让线程池中线程执行添加的所有任务,直到所有任务都完成(每个线程可能会执行多个任务)

from time import sleep
from datetime import datetime
from threading import Thread, current_thread
from random import randint
from concurrent.futures import ThreadPoolExecutor
def download(name):
    print(f'{name}下载开始{datetime.now()}', current_thread())
    sleep(randint(2, 7))
    print(f'{name}下载完成{datetime.now()}')

if __name__ == '__main__':
    # 方案1:直接使用多线程下载1000个电影
    # num = 0
    # for x in range(10):
    #     ts = []
    #     for i in range(100):
    #         num += 1
    #         t = Thread(target=download, args=(f'dy{num}',))
    #         ts.append(t)
    #         t.start()
    #     for x in ts:
    #         x.join()


    # 方案2:创建线程池
    # ThreadPoolExecutor(线程最大数)
    pool = ThreadPoolExecutor(15)

    # 添加任务
    # 一次添加一个任务  submit(函数, 实参1, 实参2....)
    # 注意:实参的数量由前面的函数在调用的时候需要的实参来决定
    # pool.submit(download, '1')
    # pool.submit(download, '2')
    # pool.submit(download, '11')

    # 同时添加多个任务:map(函数, 参数对应的序列)
    # 注意:使用map添加多个任务的时候,任务对应的函数必须是有且只有一个参数的函数
    pool.map(download, [1, 2, 3])

    # 关闭线程池
    # 线程池关闭后无法再添加新的任务,标签会阻塞当前线程等待整个线程池的任务都完成
    pool.shutdown()
3.线程池豆瓣爬虫
import csv
import requests
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
headers = {
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}


def get_date(page):
    url = f'https://movie.douban.com/top250?start={page}&filter='
    response = requests.get(url, headers=headers)
    root = etree.HTML(response.text)
    name = root.xpath('//div[@class="info"]/div[@class="hd"]/a/span[1]/text()')
    intro = root.xpath('//div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span/text()')
    rank = root.xpath('//div[@class="item"]/div[@class="pic"]/em/text()')
    all_date = map(lambda i1, i2, i3: [i1, i2, i3], rank, name, intro, )

    # w.writerows(all_date)


if __name__ == '__main__':
    all_date = []
    f = open('files/2.csv', 'w', encoding='utf-8', newline='')
    w = csv.writer(f)
    w.writerow(['排名', '电影名称', '简介'])
    pool = ThreadPoolExecutor(15)
    pool.map(get_date, [0, 25, 50, 75, 100])
    pool.shutdown()
    all_date.sort()
    w.writerows(all_date)
4.常用指令

常见的指令操作

执行指令的工具: Windows - 命令提示符(cmd) 、Mac - 终端

  1. 运行python程序: - 运算程序的计算机必须先安装python环境

win: python py文件路径
mac: python3 py文件路径

  1. 进入文件夹: cd
    cd 文件夹相对路径、文件夹绝对路径

    注意:如果是windows操作系统,cd操作如果要跨盘需要先切盘,然后再cd
    切盘方法:C:、E:、D:

  2. 查看当前文件夹的内容
    win: dir
    Mac:ls

  3. 用指令创建虚拟环境
    第一步:找到一个用来放虚拟环境的文件夹
    第二步:通过cd指令进入到存放虚拟环境的文件夹中

    第三步:创建虚拟环境
    python -m venv 虚拟环境名
    python3 -m venv 虚拟环境名

    第四步:激活虚拟环境
    (mac) source 虚拟环境目录/bin/activate
    (windows) 虚拟环境目录\ Scripts\activate.bat

    第五步:退出虚拟环境
    deactivate

5.常用pip指令(pip - Python包管理工具)
pip list - 查看当前环境已经安装过的所有的第三方库

pip install  第三方库名称		-		下载并且安装指定的第三方库
pip install  第三方库名称 -i 镜像地址		-		在指定的镜像地址中下载安装
pip install  第三方库名称==版本号	-i   镜像地址

pip install  第三方库名称1   第三方库名称2  

pip freeze > 依赖文件名  	-	生成依赖文件	
pip install -r 依赖文件路径			-		批量安装	

pip uninstall 第三方库名称   -  卸载指定的第三方库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值