匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python并发编程:实例探究多线程、协程、异步io

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多核特性,但实现相对复杂。因此在选择并发编程方式时,需要结合具体的场景和需求进行选择。