【30天玩转python】并发编程

打印 上一主题 下一主题

主题 1802|帖子 1802|积分 5406

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
并发编程

并发编程是指在同一时间处理多个使命的本事,使命大概是独立的,也大概是相互交织执行。并发编程的目标是充分利用 CPU 的多核处理本事,提升步伐的执行效率。Python 提供了多种并发编程方法,包罗多线程、多进程和异步编程。本文将先容 Python 中的几种常见并发编程方式。

1. 多线程

多线程是一种常见的并发编程方式,它允许步伐在同一进程中同时运行多个线程。Python 的 threading 模块提供了创建和管理线程的功能。
1.1 使用 threading 模块

通过 threading 模块可以轻松地创建和管理线程。下面是一个创建多线程的简朴示例:
示例:创建多线程
  1. import threading
  2. import time
  3. def worker(name):
  4.     print(f"线程 {name} 开始工作")
  5.     time.sleep(2)
  6.     print(f"线程 {name} 结束工作")
  7. # 创建多个线程
  8. threads = []
  9. for i in range(3):
  10.     thread = threading.Thread(target=worker, args=(i,))
  11.     threads.append(thread)
  12.     thread.start()
  13. # 等待所有线程完成
  14. for thread in threads:
  15.     thread.join()
  16. print("所有线程完成")
复制代码
1.2 线程的同步

由于线程之间是并发执行的,以是必要确保对共享数据的访问是安全的。Python 提供了 Lock(锁)机制来保证线程的同步。
示例:使用锁机制
  1. import threading
  2. counter = 0
  3. lock = threading.Lock()
  4. def increment():
  5.     global counter
  6.     with lock:
  7.         for _ in range(100000):
  8.             counter += 1
  9. threads = []
  10. for _ in range(2):
  11.     thread = threading.Thread(target=increment)
  12.     threads.append(thread)
  13.     thread.start()
  14. for thread in threads:
  15.     thread.join()
  16. print(f"计数器值为: {counter}")
复制代码
在这个示例中,使用 lock 来确保多个线程不会同时修改 counter,制止竞态条件。

2. 多进程

多进程是一种并发编程方式,它通过在多个进程中运行使命来实现并发。每个进程都有自己的内存空间,因此多进程可以绕过 Python 中的全局表明器锁(GIL)限制,更适合 CPU 麋集型使命。
2.1 使用 multiprocessing 模块

multiprocessing 模块用于创建和管理进程。与线程类似,进程可以并发执行使命,但进程之间的数据是独立的,无法直接共享。
示例:创建多进程
  1. import multiprocessing
  2. import time
  3. def worker(name):
  4.     print(f"进程 {name} 开始工作")
  5.     time.sleep(2)
  6.     print(f"进程 {name} 结束工作")
  7. if __name__ == "__main__":
  8.     processes = []
  9.     for i in range(3):
  10.         process = multiprocessing.Process(target=worker, args=(i,))
  11.         processes.append(process)
  12.         process.start()
  13.     for process in processes:
  14.         process.join()
  15.     print("所有进程完成")
复制代码
2.2 进程间通信

由于进程之间的数据是独立的,Python 提供了 Queue、Pipe 等机制来实现进程间通信(IPC,Inter-Process Communication)。
示例:使用 Queue 进行进程间通信
  1. import multiprocessing
  2. def worker(q):
  3.     q.put("任务完成")
  4. if __name__ == "__main__":
  5.     queue = multiprocessing.Queue()
  6.     process = multiprocessing.Process(target=worker, args=(queue,))
  7.     process.start()
  8.     process.join()
  9.     # 从队列中获取结果
  10.     result = queue.get()
  11.     print(result)
复制代码
在这个例子中,进程 worker 将结果放入队列中,主进程通过队列获取该结果。

3. 异步编程

异步编程是一种非壅闭的并发编程方式,适合 I/O 麋集型使命。异步编程的核心思想是当一个使命等候 I/O 利用时,其他使命可以继续执行,从而制止壅闭。
3.1 使用 asyncio 模块

Python 的 asyncio 模块用于编写异步步伐,通过 async 和 await 关键字定义异步函数。
示例:简朴的异步函数
  1. import asyncio
  2. async def worker(name):
  3.     print(f"任务 {name} 开始")
  4.     await asyncio.sleep(2)
  5.     print(f"任务 {name} 结束")
  6. async def main():
  7.     tasks = [worker(i) for i in range(3)]
  8.     await asyncio.gather(*tasks)
  9. # 运行异步任务
  10. asyncio.run(main())
复制代码
在这个例子中,worker 是一个异步函数,它在执行 await asyncio.sleep(2) 时不会壅闭其他使命。
3.2 异步 I/O 利用

异步编程特别适合 I/O 麋集型使命,好比网络请求、文件读写等。
示例:异步网络请求
  1. import asyncio
  2. import aiohttp
  3. async def fetch(url):
  4.     async with aiohttp.ClientSession() as session:
  5.         async with session.get(url) as response:
  6.             return await response.text()
  7. async def main():
  8.     urls = ['https://example.com', 'https://example.org']
  9.     tasks = [fetch(url) for url in urls]
  10.     results = await asyncio.gather(*tasks)
  11.     for result in results:
  12.         print(result)
  13. # 运行异步任务
  14. asyncio.run(main())
复制代码
在这个示例中,使用 aiohttp 库进行异步网络请求,实现了非壅闭的 I/O 利用。

4. 协程与生成器

Python 的生成器(generator)和协程(coroutine)也是实现并发的工具之一。协程可以通过 yield 关键字暂停和规复函数的执行。
4.1 协程示例

协程是一种比平凡生成器更高级的函数控制机制,可以通过 yield 暂停执行,再通过 send() 规复执行。
示例:协程
  1. def coroutine_example():
  2.     print("启动协程")
  3.     result = yield
  4.     print(f"接收到的值: {result}")
  5. co = coroutine_example()
  6. next(co)  # 启动协程
  7. co.send(42)  # 向协程发送值
复制代码
在这个例子中,协程通过 yield 暂停执行,再通过 send() 传递数据并规复执行。

5. 小结

并发编程在提升步伐性能和响应速度方面具有紧张作用。Python 提供了多种并发编程模子,包罗多线程、多进程和异步编程。选择哪种模子取决于使命的特点:对于 I/O 麋集型使命,异步编程是首选;对于 CPU 麋集型使命,多进程大概表现更好;多线程适合轻量级的并发使命。明白并掌握这些并发编程模子,可以或许显著提升 Python 步伐的执行效率。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表