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

Python 并发编程的 12 个实用技巧

来源: 责编: 时间:2024-05-22 17:13:43 235观看
导读今天我们要一起探索的是Python中的并发编程,这可是提升程序速度的魔法钥匙哦!别担心,即使你是新手,我也会让你一步步成为并发小能手。1. 遇见threading,多线程初体验想象一下,你在咖啡馆同时处理邮件、聊天和写代码,这就是多

今天我们要一起探索的是Python中的并发编程,这可是提升程序速度的魔法钥匙哦!别担心,即使你是新手,我也会让你一步步成为并发小能手。yTw28资讯网——每日最新资讯28at.com

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

1. 遇见threading,多线程初体验

想象一下,你在咖啡馆同时处理邮件、聊天和写代码,这就是多线程的日常。在Python里,threading模块是你的得力助手。yTw28资讯网——每日最新资讯28at.com

import threadingimport timedef say_hello(name):    print(f"Hello, {name}!")    time.sleep(2)  # 模拟耗时操作# 创建线程thread1 = threading.Thread(target=say_hello, args=("World",))thread2 = threading.Thread(target=say_hello, args=("Python",))# 启动线程thread1.start()thread2.start()# 等待所有线程完成thread1.join()thread2.join()print("All tasks done.")

这段代码创建了两个线程,分别打印不同的问候语,然后等待它们完成。记住join(),它是等待线程的守护者。yTw28资讯网——每日最新资讯28at.com

2. 并发陷阱:全局解释器锁GIL

哎呀,提到多线程,不得不提Python的“独特”设计——GIL。它就像个小警察,让CPU核心轮流执行Python字节码,这意味着多线程在CPU密集型任务中并不总是更快。别灰心,对于I/O密集型任务,多线程还是很香的!yTw28资讯网——每日最新资讯28at.com

3. multiprocessing:绕过GIL,火力全开

如果想真正利用多核CPU,multiprocessing模块是你的不二之选。它为每个进程创建独立的Python解释器,绕过GIL。yTw28资讯网——每日最新资讯28at.com

from multiprocessing import Processdef worker(num):    print(f'Worker: {num}')    time.sleep(2)if __name__ == '__main__':    processes = []    for i in range(4):        p = Process(target=worker, args=(i,))        processes.append(p)        p.start()

每个Process都是一个独立的小世界,它们并行运行,不受GIL限制。yTw28资讯网——每日最新资讯28at.com

4. 并行不是万能药

并发或并行虽然快,但也会带来复杂性,比如数据同步问题。记得使用锁(Lock)来避免资源冲突,就像在厨房里只有一个微波炉,大家轮流用。yTw28资讯网——每日最新资讯28at.com

from threading import Locklock = Lock()def safe_print(number):    with lock:        print(f'Safe print: {number}')safe_print(1)safe_print(2)

使用with语句自动管理锁,安全又方便。yTw28资讯网——每日最新资讯28at.com

5. 队列的智慧:queue.Queue

想象一个工厂的流水线,队列(Queue)就是那个协调者。在多线程/进程间传递数据,非它莫属。yTw28资讯网——每日最新资讯28at.com

from queue import Queuefrom threading import Threaddef producer(queue):    queue.put('Product')def consumer(queue):    print(queue.get())q = Queue()producer_thread = Thread(target=producer, args=(q,))consumer_thread = Thread(target=consumer, args=(q,))producer_thread.start()consumer_thread.start()producer_thread.join()consumer_thread.join()

队列保证了数据的安全传递,避免了混乱。yTw28资讯网——每日最新资讯28at.com

6. 美妙的异步:asyncio

等不及了?asyncio带你进入异步编程的世界,用async/await关键字,就像给你的代码加了翅膀。yTw28资讯网——每日最新资讯28at.com

import asyncioasync def hello(i):    print(f'Hello {i}')    await asyncio.sleep(1)  # 异步等待async def main():    tasks = [hello(i) for i in range(3)]    await asyncio.gather(*tasks)# Python 3.7+asyncio.run(main())

异步等待,让程序在等待时去做其他事,效率杠杠的。yTw28资讯网——每日最新资讯28at.com

7. 异步编程的误区:不是所有操作都能异步

虽然asyncio很强大,但并非所有函数都可以异步化,比如那些直接操作硬件的低级API。选择合适的方法,别硬塞。yTw28资讯网——每日最新资讯28at.com

8. concurrent.futures:未来的便捷通道

想要简单地并发执行任务,不论同步还是异步,concurrent.futures是你的良师益友。yTw28资讯网——每日最新资讯28at.com

from concurrent.futures import ThreadPoolExecutordef worker(n):    return n * nwith ThreadPoolExecutor() as executor:    results = executor.map(worker, range(5))    print(list(results))  # 输出平方数

用ThreadPoolExecutor轻松管理线程池,执行任务就像点菜一样简单。yTw28资讯网——每日最新资讯28at.com

9. 错误处理的艺术:优雅捕获异常

并发中错误处理很重要,使用try-except来保护你的代码,确保一个任务的失败不会影响到整个程序。yTw28资讯网——每日最新资讯28at.com

try:    # 可能会出错的并发代码except Exception as e:    print(f'Caught an exception: {e}')

保持冷静,优雅处理,你的程序更健壮。yTw28资讯网——每日最新资讯28at.com

10. 资源管理:上下文管理器与with

with语句不仅仅是为了代码简洁,它还能确保资源(如文件、锁)的正确释放,避免并发中的资源泄露。yTw28资讯网——每日最新资讯28at.com

with Lock():    # 在这里安全地操作共享资源

自动的开始与结束,像一位细心的管家。yTw28资讯网——每日最新资讯28at.com

11. 性能监控:看穿并发的幕后

使用timeit, cProfile等工具来监控你的并发程序,了解哪些部分慢如蜗牛,哪些是速度恶魔,优化从了解开始。yTw28资讯网——每日最新资讯28at.com

12. 实战演练:并发下载图片

最后,让我们实战一把,用多线程下载图片,感受并发的魅力。yTw28资讯网——每日最新资讯28at.com

import osimport requestsfrom threading import Threaddef download_image(url, filename):    response = requests.get(url)    with open(filename, 'wb') as f:        f.write(response.content)    print(f'{filename} downloaded.')urls = ['img_url1', 'img_url1']  # 假设的URLthreads = []for url in urls:    t = Thread(target=download_image, args=(url, os.path.basename(url)))    threads.append(t)    t.start()for t in threads:    t.join()print('All images downloaded.')

通过并发下载,我们可以显著加快下载速度!yTw28资讯网——每日最新资讯28at.com

到这里,我们已经解锁了Python并发编程的12个实用技巧,是不是感觉自己的编程技能又上了一个新台阶?实践是检验真理的唯一标准,赶紧动手试试,让你的程序跑得飞起来吧!yTw28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-90039-0.htmlPython 并发编程的 12 个实用技巧

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

上一篇: 阿里面试:说说自适应限流?

下一篇: Vue3 实现最近很火的酷炫功能:卡片悬浮发光

标签:
  • 热门焦点
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为“纯欲天花板”的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 华为Mate 60系列用上可变灵动岛:正式版体验将会更出色

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
Top