多任务与并发是指在单个程序中同时或交替处理多个任务的能力。在实际应用中,为了提高程序执行效率,常常需要同时处理多个任务。多任务与并发技术能够让程序在同一时间内执行多个任务,从而缩短整体处理时间。这对于需要同时处理网络请求、文件读写或其他 I/O 密集型操作的自动化流程尤为重要。学习多任务与并发不仅可以提高程序的响应速度,还能更好地利用系统资源,使您的自动化项目更加高效、稳定。
在 Python 中,由于全局解释器锁(GIL)的存在,真正的并行执行在 CPU 密集型任务中可能受到限制,但对于 I/O 密集型任务,多任务和并发依然能够显著提高效率。`threading` 模块主要用于创建多个线程来处理任务,而 `asyncio` 模块则采用异步编程模式,通过事件循环调度任务,使得程序在等待I/O操作时能继续执行其他任务。掌握这些技术能够帮助您更好地设计和优化自动化流程,提升数据处理和网络请求的效率。
使用 threading 实现多任务
`threading` 模块允许您在程序中创建多个线程,这些线程可以同时执行任务,适用于需要同时处理多个 I/O 操作的场景。下面是一个简单的示例代码,展示如何使用 `threading` 来创建和启动多个线程,并等待所有线程完成任务。
示例代码:
import threading
import time
def task(name, delay):
for i in range(3):
print(f"任务 {name} 正在运行: {i}")
time.sleep(delay)
print(f"任务 {name} 完成。")
# 创建两个线程,分别执行不同的任务
thread1 = threading.Thread(target=task, args=("A", 1))
thread2 = threading.Thread(target=task, args=("B", 2))
# 启动线程
thread1.start()
thread2.start()
# 等待所有线程结束
thread1.join()
thread2.join()
print("所有任务完成。") 代码说明
- 定义了一个
task函数,用于模拟任务执行,每个任务打印运行状态并等待一定时间。 - 使用
threading.Thread创建两个线程,分别传入任务名称和延迟时间。 - 启动线程后,通过
join()方法等待所有线程完成,最后输出任务完成信息。
提示词示例:
提示词:
请编写一段 Python 代码,实现如下功能,并保证生成的代码与下面提供的示例代码完全一致(包括缩进、空行、注释和字符串内容):
- 导入 threading 和 time 模块。
- 定义一个名为 task 的函数,该函数接受两个参数:name 和 delay。在函数中,循环 3 次,每次打印格式化字符串 f"任务 {name} 正在运行: {i}",然后调用 time.sleep(delay) 进行延时。循环结束后,打印 f"任务 {name} 完成。"。
- 在主程序中,使用 threading.Thread 分别创建两个线程,第一个线程调用 task("A", 1),第二个线程调用 task("B", 2)。
- 启动这两个线程,并使用 join() 方法等待所有线程结束。
- 最后,打印 “所有任务完成。”。
使用 asyncio 实现异步任务
asyncio 模块提供了基于事件循环的异步编程方式,适用于处理大量 I/O 密集型操作或高并发场景。与线程不同,asyncio 通过协程和事件循环实现并发处理,不会创建多个系统级线程,从而减少了上下文切换的开销。下面的示例代码展示了如何使用 asyncio 实现异步任务调度。
示例代码:
import asyncio
async def async_task(name, delay):
for i in range(3):
print(f"异步任务 {name} 正在运行: {i}")
await asyncio.sleep(delay)
print(f"异步任务 {name} 完成。")
async def main():
# 创建两个异步任务
task1 = asyncio.create_task(async_task("X", 1))
task2 = asyncio.create_task(async_task("Y", 2))
# 等待所有异步任务完成
await task1
await task2
print("所有异步任务完成。")
# 启动事件循环
asyncio.run(main())
代码说明
- 定义了一个异步函数
async_task,使用await asyncio.sleep(delay)模拟异步等待,并打印任务执行状态。 - 在
main协程中,使用asyncio.create_task()创建两个异步任务,并使用await等待任务完成。 - 最后,通过
asyncio.run(main())启动事件循环,运行整个异步任务流程。
提示词示例:
提示词:
请编写一段 Python 代码,实现如下功能:
- 使用 threading 模块创建两个线程,每个线程分别执行一个模拟任务。
- 每个线程的模拟任务应按照以下步骤执行:
- 打印任务名称和当前运行状态(例如:“任务 A 正在运行: 0”)。
- 使用 time.sleep() 模拟等待,延迟时间可以分别设置为 1 秒和 2 秒(或其他合理的时间)。
- 循环执行3次后,打印任务完成信息(例如:“任务 A 完成。”)。
- 主程序需要启动这两个线程,并等待所有线程完成后,再打印“所有任务完成。”。
请确保生成的代码能够直接运行,并完整展示每个任务的执行过程,同时包含必要的注释说明代码的各个部分。
- 请修改 threading 示例代码,增加一个功能:在每个线程执行结束后记录线程执行时间,并将这些信息写入日志文件中。
- 请设计一个提示词,让生成的 asyncio 代码支持同时调度多个异步任务,并允许用户自定义任务延迟时间,最后统计所有任务的总执行时间。
AI 助教
提示:您可在此提出学习中遇到的问题。回答由 AI 生成,可能存在错误,请注意甄别。
