Python中并发编程主要有以下几种方式:
1. 多线程:
- 使用
threading
模块创建线程,并执行任务。 - 线程之间需要使用锁(Lock)来同步访问共享数据。
- 多线程适用于I/O密集型任务,CPU密集型任务不太适用(Python GIL机制的限制)。
import threading
lock = threading.Lock()
def task1():
lock.acquire()
print('Task 1 running')
# do something...
lock.release()
def task2():
lock.acquire()
print('Task 2 running')
# do something...
lock.release()
t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)
t1.start()
t2.start()
2. 多进程:
- 使用
multiprocessing
模块创建进程,并执行任务。 - 进程之间是完全隔离的,需要通过队列.管道等来通信。
- 多进程可以利用多核CPU,适用于CPU密集型任务。
from multiprocessing import Process
def task1():
print('Task 1 running')
# do something...
def task2():
print('Task 2 running')
# do something...
if __name__ == '__main__':
p1 = Process(target=task1)
p2 = Process(target=task2)
p1.start()
p2.start()
3. 协程:
- 使用
yield
或者asyncio
模块实现协程,以异步的方式执行任务。 - 协程之间可以简单地共享数据,并且切换成本更低。
- 协程适用于I/O密集型任务,可以实现高并发。
import asyncio
async def task1():
print('Task 1 running')
await asyncio.sleep(1)
async def task2():
print('Task 2 running')
await asyncio.sleep(2)
asyncio.run(asyncio.gather(task1(), task2()))