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

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

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

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

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

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

想象一下,你在咖啡馆同时处理邮件、聊天和写代码,这就是多线程的日常。在Python里,threading模块是你的得力助手。Zw528资讯网——每日最新资讯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(),它是等待线程的守护者。Zw528资讯网——每日最新资讯28at.com

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

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

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

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

4. 并行不是万能药

并发或并行虽然快,但也会带来复杂性,比如数据同步问题。记得使用锁(Lock)来避免资源冲突,就像在厨房里只有一个微波炉,大家轮流用。Zw528资讯网——每日最新资讯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语句自动管理锁,安全又方便。Zw528资讯网——每日最新资讯28at.com

5. 队列的智慧:queue.Queue

想象一个工厂的流水线,队列(Queue)就是那个协调者。在多线程/进程间传递数据,非它莫属。Zw528资讯网——每日最新资讯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()

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

6. 美妙的异步:asyncio

等不及了?asyncio带你进入异步编程的世界,用async/await关键字,就像给你的代码加了翅膀。Zw528资讯网——每日最新资讯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())

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

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

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

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

想要简单地并发执行任务,不论同步还是异步,concurrent.futures是你的良师益友。Zw528资讯网——每日最新资讯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轻松管理线程池,执行任务就像点菜一样简单。Zw528资讯网——每日最新资讯28at.com

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

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

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

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

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

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

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

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

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

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

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

最后,让我们实战一把,用多线程下载图片,感受并发的魅力。Zw528资讯网——每日最新资讯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.')

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

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

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

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

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

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

标签:
  • 热门焦点
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元“人在职场,应该选择什么样的着装?”近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
Top