Python并发编程:多线程、多进程、协程实践
在当今互联网高速发展的时代,单线程模型已经不能满足时代和业务的需求,所以并发编程越来越受到关注。Python作为一门非常流行的面向对象的解释型编程语言,本身也提供了很多的并发编程的方式,如多线程、多进程、协程等。
在本文中,我们将详细介绍Python并发编程的三种方式,并通过实际案例来演示其实现方法和注意事项。
一、多线程
在Python中,可以使用threading模块来实现多线程编程。在这种模式下,主线程可以创建多个子线程,每个线程都是独立的并可以并发执行。
1. 创建线程
要创建线程,我们需要使用threading模块中的Thread类,通过继承Thread类并实现run()方法来创建线程对象。
```python
import threading
class MyThread(threading.Thread):
def __init__(self, arg1, arg2):
threading.Thread.__init__(self)
self.arg1 = arg1
self.arg2 = arg2
def run(self):
# 线程执行任务
print(self.arg1 + self.arg2)
# 创建线程对象
t = MyThread(10, 20)
t.start()
```
2. 线程同步
线程同步是指在多个线程之间协调处理数据或资源以防止冲突和竞争条件。在Python中,可以使用锁来进行线程同步。
```python
import threading
# 创建锁对象
lock = threading.Lock()
num = 0
def add_num():
global num
# 获取锁
lock.acquire()
for i in range(1000000):
num += 1
print(num)
# 释放锁
lock.release()
# 创建10个线程执行任务
threads = []
for i in range(10):
t = threading.Thread(target=add_num)
threads.append(t)
for t in threads:
t.start()
```
二、多进程
在Python中,可以使用multiprocessing模块来实现多进程编程。和多线程编程类似,主进程可以创建多个子进程并并发执行。
1. 创建进程
要创建进程,我们需要使用multiprocessing模块中的Process类,通过继承Process类并实现run()方法来创建进程对象。
```python
import multiprocessing
class MyProcess(multiprocessing.Process):
def __init__(self, arg1, arg2):
multiprocessing.Process.__init__(self)
self.arg1 = arg1
self.arg2 = arg2
def run(self):
# 进程执行任务
print(self.arg1 + self.arg2)
# 创建进程对象
p = MyProcess(10, 20)
p.start()
```
2. 进程通信
在Python多进程编程中,由于多个进程之间是独立的,所以不能直接共享内存,必须通过IPC(进程间通信)方式进行数据的传输。
```python
import multiprocessing
# 通过Queue进行进程间通信
def write_task(q):
for value in ['A', 'B', 'C']:
q.put(value)
print('Put %s to queue...' % value)
time.sleep(random.random())
def read_task(q):
while True:
value = q.get(True)
print('Get %s from queue.' % value)
if __name__ == '__main__':
# 创建进程间通信的队列
q = multiprocessing.Queue()
pw = multiprocessing.Process(target=write_task, args=(q,))
pr = multiprocessing.Process(target=read_task, args=(q,))
pw.start()
pr.start()
pw.join()
pr.terminate()
```
三、协程
协程是一种轻量级的线程,可以在单线程中实现并发执行。在Python中,可以使用asyncio模块来实现协程。
1. 创建协程
要创建协程,我们需要使用async关键字来定义一个协程函数,使用await关键字来切换协程执行。
```python
import asyncio
async def hello():
print('Hello world!')
r = await asyncio.sleep(1)
print('Hello again!')
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()
```
2. 协程同步
虽然协程可以在单线程中实现并发,但是由于协程的执行是由事件循环来调度的,所以我们需要使用asyncio提供的锁来进行协程同步。
```python
import asyncio
# 创建锁对象
lock = asyncio.Lock()
num = 0
async def add_num():
global num
# 获取锁
async with lock:
for i in range(1000000):
num += 1
print(num)
# 创建10个协程执行任务
tasks = []
for i in range(10):
tasks.append(add_num())
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
```
总结
Python并发编程提供了多线程、多进程、协程三种方式,每种方式都有其特点和适用场景。在实际应用中,我们需要根据具体的业务需求来选择合适的并发方式。同时,在并发编程中,线程同步和进程通信都是非常重要的技术点,需要认真学习和掌握。