Python并发编程:实例探究多线程、协程、异步io Python作为一种高级编程语言,由于其简单易学,优雅简洁,受到了越来越多开发者的喜欢。随着互联网的高速发展,Python的应用场景越来越广泛,如网络爬虫、数据分析、机器学习等。而并发编程也是Python中一个非常重要的话题。 并发编程是指在一个程序内同时执行多个任务的能力。在Python中,常见的并发编程方式有多线程、协程和异步io。本文将通过实例来探究这三种方式的具体实现。 一、多线程 多线程是指在一个进程内启动多个线程,每个线程执行不同的任务。多线程的最大特点是提高了程序的效率和并发性。 下面是一个简单的多线程实例: ```python import threading def hello(): print("Hello, World!") def hi(): print("Hi, Python!") t1 = threading.Thread(target=hello) t2 = threading.Thread(target=hi) t1.start() t2.start() t1.join() t2.join() print("All done!") ``` 在上面的代码中,我们使用了Python内置模块threading,定义了两个线程,分别调用hello()和hi()函数。然后通过start()方法启动线程,通过join()方法等待线程执行完毕。最后打印"All done!"表示程序执行结束。 二、协程 协程是一种轻量级的线程,可以在单个线程中实现并发执行。协程可以看作是一种用户态的线程,它由用户自己控制切换,比线程切换更加高效。 下面是一个简单的协程实例: ```python import asyncio async def hello(): print("Hello, World!") async def hi(): print("Hi, Python!") async def main(): task1 = asyncio.create_task(hello()) task2 = asyncio.create_task(hi()) await task1 await task2 asyncio.run(main()) print("All done!") ``` 在上面的代码中,我们使用了Python内置模块asyncio,定义了三个协程函数hello()、hi()和main()。通过asyncio.create_task()方法创建任务,使用await关键字等待任务执行完毕。在程序异步执行的过程中,程序没有被阻塞。最后打印"All done!"表示程序执行结束。 三、异步io 异步io是Python 3.4版本引入的新特性,它利用了CPU的多核特性,将耗时的io操作交给操作系统完成,从而实现高效的并发执行。它可以看作是一种更加高级的协程实现方式。 下面是一个异步io实例: ```python import asyncio import aiohttp async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(): async with aiohttp.ClientSession() as session: html = await fetch(session, 'http://www.baidu.com') print(html) asyncio.run(main()) print("All done!") ``` 在上面的代码中,我们使用了Python内置模块aiohttp,定义了两个异步io函数fetch()和main()。fetch()函数使用async with语句打开一个异步http请求,使用await关键字等待响应。main()函数使用async with语句打开一个异步http会话,调用fetch()函数获取百度首页的html代码,并打印输出。最后打印"All done!"表示程序执行结束。 总结 通过上面的实例,我们可以看出,多线程、协程和异步io都是Python中比较常见的并发编程方式,在不同的场景下都有其优缺点。多线程能够提高效率,但会存在线程安全问题;协程是一种轻量级的线程,可以实现高效并发,但无法充分利用多核CPU;异步io能够高效地利用CPU多核特性,但实现相对复杂。因此在选择并发编程方式时,需要结合具体的场景和需求进行选择。