通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python3如何并发执行函数demo

python3如何并发执行函数demo

Python3 并发执行函数的方法有多种,包括使用多线程、多进程和异步编程。 主要的方法包括线程池、进程池和 asyncio 库。下面将详细介绍这些方法,并给出具体的示例代码。

一、使用线程池并发执行函数

Python 的 concurrent.futures.ThreadPoolExecutor 类可以方便地创建和管理线程池,适用于 I/O 密集型任务。

线程池基础示例

import concurrent.futures

import time

def task(n):

print(f'Task {n} started')

time.sleep(2)

print(f'Task {n} finished')

return n * 2

if __name__ == "__main__":

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:

futures = [executor.submit(task, i) for i in range(10)]

for future in concurrent.futures.as_completed(futures):

print(f'Result: {future.result()}')

在这个示例中,我们创建了一个包含 5 个线程的线程池,并提交了 10 个任务,每个任务会在 2 秒后完成。最终输出每个任务的结果。

二、使用进程池并发执行函数

对于 CPU 密集型任务,使用 concurrent.futures.ProcessPoolExecutor 类来创建和管理进程池。

进程池基础示例

import concurrent.futures

import time

def task(n):

print(f'Task {n} started')

time.sleep(2)

print(f'Task {n} finished')

return n * 2

if __name__ == "__main__":

with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:

futures = [executor.submit(task, i) for i in range(10)]

for future in concurrent.futures.as_completed(futures):

print(f'Result: {future.result()}')

这个示例与线程池的示例类似,只是使用了 ProcessPoolExecutor 来替代 ThreadPoolExecutor,适合 CPU 密集型任务。

三、使用 asyncio 并发执行函数

asyncio 是 Python 的异步 I/O 框架,适用于 I/O 密集型任务和高并发场景。

asyncio 基础示例

import asyncio

async def task(n):

print(f'Task {n} started')

await asyncio.sleep(2)

print(f'Task {n} finished')

return n * 2

async def main():

tasks = [task(i) for i in range(10)]

results = await asyncio.gather(*tasks)

print(f'Results: {results}')

if __name__ == "__main__":

asyncio.run(main())

在这个示例中,使用了 asyncio 来并发执行任务,每个任务会在 2 秒后完成,并最终输出所有任务的结果。

四、选择合适的并发模型

选择合适的并发模型取决于任务的类型:

  • I/O 密集型任务(如网络请求、文件操作):使用线程池或 asyncio
  • CPU 密集型任务(如计算密集的操作):使用进程池。

I/O 密集型任务示例

使用 requests 库进行网络请求,并使用线程池和 asyncio 分别实现并发。

使用线程池

import requests

import concurrent.futures

def fetch(url):

response = requests.get(url)

return response.status_code

urls = ['http://example.com' for _ in range(10)]

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:

futures = [executor.submit(fetch, url) for url in urls]

for future in concurrent.futures.as_completed(futures):

print(f'Status Code: {future.result()}')

使用 asyncio 和 aiohttp

import aiohttp

import asyncio

async def fetch(session, url):

async with session.get(url) as response:

return response.status

async def main():

async with aiohttp.ClientSession() as session:

tasks = [fetch(session, 'http://example.com') for _ in range(10)]

results = await asyncio.gather(*tasks)

print(f'Status Codes: {results}')

if __name__ == "__main__":

asyncio.run(main())

CPU 密集型任务示例

使用 concurrent.futures.ProcessPoolExecutor 实现并发。

import concurrent.futures

import math

def compute_factorial(n):

return math.factorial(n)

numbers = [100000] * 10

with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:

futures = [executor.submit(compute_factorial, num) for num in numbers]

for future in concurrent.futures.as_completed(futures):

print(f'Factorial: {future.result()}')

总结

并发编程可以显著提高程序的效率,尤其在处理大量 I/O 操作或需要并行计算的场景下。选择合适的并发模型(线程池、进程池或异步编程)是关键。对于 I/O 密集型任务,推荐使用线程池或 asyncio;对于 CPU 密集型任务,推荐使用进程池。

通过上述示例代码,可以在不同场景下应用合适的并发模型,实现高效的并发执行函数。

相关问答FAQs:

如何在Python3中实现并发执行?
Python3提供了多种方式来实现并发执行,包括多线程、进程池和异步编程等。使用concurrent.futures模块中的ThreadPoolExecutorProcessPoolExecutor可以简化并发编程。通过这些工具,可以轻松地创建线程或进程池来并行执行多个函数。

在Python3中,哪些场景适合使用多线程?
多线程非常适合I/O密集型任务,例如网络请求、文件读写等。这是因为在I/O操作期间,线程会处于等待状态,CPU可以切换到其他线程进行处理。相比之下,对于CPU密集型任务,使用多进程可能更有效,因为Python的全局解释器锁(GIL)会限制多线程在CPU密集型任务中的性能提升。

如何使用asyncio实现并发?
asyncio是Python3中的异步编程库,特别适合处理大量的I/O操作。通过使用asyncawait关键字,可以定义异步函数,并通过asyncio.run()来运行它们。使用asyncio.gather()可以并发地执行多个异步任务,极大地提高代码的执行效率,尤其是在处理网络请求和数据库操作时。

相关文章