当前位置:首页 > 科技  > 软件

Python 多线程编程的十个关键概念

来源: 责编: 时间:2024-05-21 17:30:30 81观看
导读今天我们要一起探索的是Python编程中的一个超炫酷领域——多线程!想象一下,你的程序能像超人一样同时处理多个任务,是不是很激动人心?让我们以轻松愉快的方式,一步步揭开它的神秘面纱。1. 线程的初步认知想象你是个厨房大

今天我们要一起探索的是Python编程中的一个超炫酷领域——多线程!想象一下,你的程序能像超人一样同时处理多个任务,是不是很激动人心?让我们以轻松愉快的方式,一步步揭开它的神秘面纱。nk028资讯网——每日最新资讯28at.com

nk028资讯网——每日最新资讯28at.com

1. 线程的初步认知

想象你是个厨房大厨,一边炒菜一边洗菜,这就是多线程的日常。在Python里,threading模块就是我们的厨房神器。nk028资讯网——每日最新资讯28at.com

import threadingdef cook():  # 炒菜线程    print("炒菜中...")    def wash():  # 洗菜线程    print("洗菜中...")# 创建线程对象thread1 = threading.Thread(target=cook)thread2 = threading.Thread(target=wash)# 启动线程thread1.start()thread2.start()# 等待所有线程完成thread1.join()thread2.join()print("饭做好啦!")

这段代码中,Thread类用来创建线程,target参数指定线程要执行的函数。start()让线程开始执行,而join()确保主线程等待这些小线程们完成它们的任务。nk028资讯网——每日最新资讯28at.com

2. 线程同步:避免厨房混乱

在多线程世界,如果两个线程同时操作同一资源(比如共享食材),就可能出乱子。这时就需要“锁”来帮忙了,Python里的锁叫Lock。nk028资讯网——每日最新资讯28at.com

import threadingshared_resource = 0lock = threading.Lock()def increase():     global shared_resource    lock.acquire()  # 上锁,防止同时访问    shared_resource += 1    lock.release()  # 解锁,释放控制权threads = [threading.Thread(target=increase) for _ in range(100)]for t in threads:    t.start()for t in threads:    t.join()print("共享资源的最终值:", shared_resource)

每次访问共享资源前,先acquire()上锁,操作完后release()解锁,这样就避免了数据混乱。nk028资讯网——每日最新资讯28at.com

3. 死锁:可怕的厨房僵局

但锁用不好也会出问题,就像两个厨师互相等待对方手中的锅,形成了死锁。要小心设计,避免循环等待。nk028资讯网——每日最新资讯28at.com

4. 线程池:高效管理厨房帮手

想象一下,如果你每次炒菜都要新雇一个厨师,那得多浪费?线程池(ThreadPoolExecutor)就是解决这个问题的神器,它预先创建好一些线程,重复利用。nk028资讯网——每日最新资讯28at.com

from concurrent.futures import ThreadPoolExecutordef task(n):    print(f"执行任务{n}")with ThreadPoolExecutor(max_workers=5) as executor:    executor.map(task, range(1, 6))

这里,ThreadPoolExecutor创建了一个最多有5个线程的池,map()函数并行执行任务列表中的每个任务。nk028资讯网——每日最新资讯28at.com

5. 守护线程:厨房的清洁工

守护线程就像厨房的清洁工,在所有其他线程完成后默默清理。通过setDaemon(True)设置线程为守护线程。nk028资讯网——每日最新资讯28at.com

def cleaner():    while True:  # 假设这是一个无限循环,清理任务        print("打扫厨房...")        if not other_threads_running():  # 假定函数检查其他线程是否还在运行            breakclean_thread = threading.Thread(target=cleaner)clean_thread.setDaemon(True)clean_thread.start()# 其他线程的代码...print("厨房关闭,清洁完成。")

6. 线程优先级:谁先炒谁先洗

虽然Python标准库没有直接提供线程优先级的功能,但可以通过队列等间接实现。不过,大多数情况下,Python的线程调度是公平的,不需要担心。nk028资讯网——每日最新资讯28at.com

7. 全局解释器锁(GIL)

Python的GIL是一个让人又爱又恨的东西,它保证了任何时刻只有一个线程在执行Python字节码,这对多核CPU来说不是个好消息。但在I/O密集型任务中,GIL的影响没那么大。nk028资讯网——每日最新资讯28at.com

8. 线程局部存储:我的调料我做主

不同线程需要不同的“调料”怎么办?threading.local()来帮忙,它提供了线程本地的存储空间。nk028资讯网——每日最新资讯28at.com

import threadinglocal_data = threading.local()def set_data():    local_data.value = "这是我的调料"def get_data():    print(local_data.value)t1 = threading.Thread(target=set_data)t2 = threading.Thread(target=get_data)t1.start()t2.start()t1.join()t2.join()

在这里,每个线程都有自己的local_data,互不影响。nk028资讯网——每日最新资讯28at.com

9. 线程异常处理:防患于未然

线程中的异常不会自动传递到主线程,需要用try-except捕获处理。nk028资讯网——每日最新资讯28at.com

def risky_task():    raise ValueError("出错了!")try:    t = threading.Thread(target=risky_task)    t.start()    t.join()except ValueError as e:    print(f"捕获到异常: {e}")

确保即使线程出错,程序也不会突然崩溃。nk028资讯网——每日最新资讯28at.com

10. 实战演练:多线程下载

最后,来点实战吧,比如多线程下载图片,体验速度的提升。nk028资讯网——每日最新资讯28at.com

import requestsimport threadingfrom queue import Queuedef download_image(url):    response = requests.get(url)    with open(f"image_{url[-4:]}", 'wb') as f:        f.write(response.content)    print(f"下载完成:{url}")image_urls = ["http://example.com/image1.jpg", "http://example.com/image2.jpg"]  # 假设的URLqueue = Queue()threads = []for url in image_urls:    queue.put(url)def worker():    while not queue.empty():        url = queue.get()        download_image(url)        queue.task_done()for _ in range(3):  # 启动3个下载线程    t = threading.Thread(target=worker)    t.start()    threads.append(t)# 等待所有下载任务完成for t in threads:    t.join()print("所有图片下载完成!")

通过队列分配任务给多个线程,实现了并行下载,大大提高了效率。nk028资讯网——每日最新资讯28at.com

好啦,今天的探险就到这里!希望你已经对Python多线程有了更深入的理解。nk028资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-89711-0.htmlPython 多线程编程的十个关键概念

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python vs. Rust:打破三大障碍

下一篇: C# 线程池的使用方法

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • 服务存储设计模式:Cache-Aside模式

    服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • Temu起诉SHEIN,跨境电商战事升级

    Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 猿辅导与新东方的两种“归途”

    猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 外交部:美方应停止在网络安全问题上不负责任地指责他国

    外交部:美方应停止在网络安全问题上不负责任地指责他国

      中国外交部今天(16日)举行例行记者会。会上,有记者问,美国情报官员称,他们正在阻拦来自中国以及其他国家的黑客获取相关科研成果。 中方对此有何评论?对此
Top
Baidu
map