2.并发编程-线程

文章介绍了Python中线程的基本操作,如t.start()启动线程,t.join()等待线程结束,以及线程锁的使用确保全局变量在多线程环境下的正确性。同时,展示了如何利用线程池(ThreadPoolExecutor)进行批量图片下载,通过设置回调函数保存图片到本地。
摘要由CSDN通过智能技术生成

目录

一、线程常用方法

二、线程池

三、线程锁


一、线程常用方法

t.start(),当前线程准备就绪(等待CPU调度,具体时间是由CPU来决定)。

t.join(),等待当前线程的任务执行完毕后再向下继续执行。

import time
from threading import Thread,Lock

number = 0
"""
线程会修改全局变量的值,局部变量的值会改变么?
"""
lock=Lock()
def fun1():
    global number

    for i in range(1000000):
        lock.acquire()
        number += 1
        lock.release()
    print('fun1,number变量值为:', number)


def fun2():

    global number
    for i in range(1000000):
        lock.acquire()
        number += 1
        lock.release()
    print('fun2,number变量值为:', number)


if __name__ == '__main__':
    t1 = Thread(target=fun1)
    t2 = Thread(target=fun2)

    t1.start()
    t2.start()

    t1.join()
    t2.join()

二、线程池

批量下载图片

img.txt

weiwei,https://lmg.jj20.com/up/allimg/4k/s/02/210924224R45162-0-lp.jpg
jiangge,https://up.enterdesk.com/edpic_source/aa/9f/af/aa9faf91f2c01c02cf216fd24c1705de.jpg
huanrong,https://img.tukuppt.com/photo-big/00/01/77/618c7528d1be37922.jpg
xiaohong,https://up.enterdesk.com/edpic_source/ce/0c/52/ce0c5214f3741faedfdee5c69ee513bc.jpg
damei,https://up.enterdesk.com/edpic_source/b9/4a/e9/b94ae9e9f03d895eeadf5e0f9f210382.jpg
import requests
from concurrent.futures import ThreadPoolExecutor


def download(image_url):
    res = requests.get(
        url=image_url,
        headers={
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
        }
    )
    return res


def flie_name_param(file_name):
    def save_img(response):
        res = response.result()
        # 将下载的图片的内容写入到文件
        with open(file_name, mode='wb') as f:
            f.write(res.content)

    return save_img


pool = ThreadPoolExecutor(7)

with open("img.txt", mode='r', encoding='utf-8') as f:
    for line in f:
        name, url = line.split(',')
        file_name = "{}.jpg".format(name).strip()
        url = url.strip()
        fur = pool.submit(download, url)
        # 回调,通过闭包的方式传递参数
        fur.add_done_callback(flie_name_param(file_name))

三、线程锁

import time
from threading import Thread, Lock

number = 0
"""
线程会修改全局变量的值
"""
lock = Lock()


def fun1():
    global number

    for i in range(1000000):
        lock.acquire()
        number += 1
        lock.release()
    print('fun1,number变量值为:', number)


def fun2():
    global number
    for i in range(1000000):
        lock.acquire()
        number += 1
        lock.release()
    print('fun2,number变量值为:', number)


if __name__ == '__main__':
    t1 = Thread(target=fun1)
    t2 = Thread(target=fun2)

    t1.start()
    t2.start()

    t1.join()
    t2.join()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘缘浮梦

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值