Python高级并发编程的实例详解

发布时间:2023年12月30日

f8e29b8ecc00dceb5c03b35674f0ccd5.jpeg

更多Python学习内容:ipengtao.com

Python中的高效并发编程,有几个重要的概念和工具可以帮助大家充分利用多核处理器和提高程序性能。本文将介绍一些关键的概念和示例代码,以帮助大家更好地理解Python中的高效并发编程。

多线程 vs. 多进程

在Python中,可以使用多线程和多进程来实现并发性。多线程适用于I/O密集型任务,因为Python的全局解释器锁(GIL)限制了多线程程序在多核处理器上的并行性能。多进程适用于CPU密集型任务,因为每个进程都有自己独立的解释器和内存空间,不受GIL的限制。

以下是一个示例,演示了如何使用threading模块创建多个线程来执行并发任务:

import?threading

def?worker(thread_id):
????print(f"Thread?{thread_id}?is?working")

#?创建5个线程
threads?=?[]
for?i?in?range(5):
????thread?=?threading.Thread(target=worker,?args=(i,))
????threads.append(thread)
????thread.start()

#?等待所有线程完成
for?thread?in?threads:
????thread.join()

print("All?threads?have?finished")

另一方面,以下是一个示例,演示了如何使用multiprocessing模块创建多个进程来执行并发任务:

import?multiprocessing

def?worker(process_id):
????print(f"Process?{process_id}?is?working")

#?创建5个进程
processes?=?[]
for?i?in?range(5):
????process?=?multiprocessing.Process(target=worker,?args=(i,))
????processes.append(process)
????process.start()

#?等待所有进程完成
for?process?in?processes:
????process.join()

print("All?processes?have?finished")

异步编程

异步编程是另一种处理并发的方式,特别适用于I/O密集型任务。Python提供了asyncio库来支持异步编程,使你能够编写非阻塞的、高效的代码。

以下是一个示例,演示了如何使用asyncio创建异步任务:

import?asyncio

async?def?main():
????print("Start")

????async?def?foo():
????????await?asyncio.sleep(1)
????????print("Foo")

????async?def?bar():
????????await?asyncio.sleep(2)
????????print("Bar")

????await?asyncio.gather(foo(),?bar())

????print("End")

asyncio.run(main())

在上面的示例中,asyncio允许foobar函数同时执行,而不会阻塞主线程。这种方式可以显著提高I/O密集型任务的性能。

线程和进程池

除了直接创建线程和进程,Python还提供了线程池和进程池,这些池可以更好地管理并发任务。使用线程池和进程池可以降低线程和进程创建销毁的开销,提高性能。

以下是一个示例,演示如何使用concurrent.futures模块创建线程池和进程池:

import?concurrent.futures

def?worker(task_id):
????return?f"Task?{task_id}?is?complete"

#?使用线程池
with?concurrent.futures.ThreadPoolExecutor(max_workers=4)?as?executor:
????results?=?[executor.submit(worker,?i)?for?i?in?range(10)]

????for?future?in?concurrent.futures.as_completed(results):
????????print(future.result())

#?使用进程池
with?concurrent.futures.ProcessPoolExecutor(max_workers=4)?as?executor:
????results?=?[executor.submit(worker,?i)?for?i?in?range(10)]

????for?future?in?concurrent.futures.as_completed(results):
????????print(future.result())

锁和同步

在并发编程中,为了避免竞态条件和数据共享问题,可能需要使用锁和同步机制。Python的threadingmultiprocessing模块提供了各种锁的实现,如LockSemaphoreEvent,可以帮助控制线程或进程的访问。

以下是一个示例,演示了如何使用Lock来保护共享资源:

import?threading

shared_resource?=?0
lock?=?threading.Lock()

def?increment_shared_resource():
????global?shared_resource
????with?lock:
????????shared_resource?+=?1

def?decrement_shared_resource():
????global?shared_resource
????with?lock:
????????shared_resource?-=?1

总结

在本文中,深入探讨了Python中的高效并发编程。并发编程是一项关键技能,可以帮助你充分利用多核处理器,提高程序性能和效率。介绍了多线程、多进程和异步编程这三种主要的并发编程方式,并提供了示例代码来帮助读者更好地理解和应用这些概念。

首先,讨论了多线程和多进程的区别以及适用场景。多线程适用于I/O密集型任务,而多进程适用于CPU密集型任务。展示了如何使用Python的threadingmultiprocessing模块来创建线程和进程,以及如何使用线程池和进程池来更好地管理并发任务。

接着,介绍了异步编程,它在I/O密集型任务中表现出色。使用Python的asyncio库,我们展示了如何创建非阻塞的异步任务,以提高程序性能。演示了协程的概念和如何使用await关键字进行异步操作。

总结而言,本文为大家提供了深入了解Python高效并发编程的机会。通过掌握这些概念和技巧,能够更好地应对多任务处理、性能优化和资源管理方面的挑战。无论是处理网络请求、数据处理还是并行计算,高效的并发编程都是提高Python应用程序性能的关键。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

? 100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

c16ea9cbf1b33a055147ceaf21d193b0.png

点击“阅读原文”,获取更多学习内容

文章来源:https://blog.csdn.net/wuShiJingZuo/article/details/135301300
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。