1.当你使用 concurrent.futures.ThreadPoolExecutor()
来创建线程池时,你可以将需要并行执行的代码放在 executor.submit()
方法中。这样,线程池会负责管理线程的创建和销毁,以及任务的调度和执行
import concurrent.futures
def your_task(argument):
# 这是你想要并行处理的任务的代码
# 在这里编写你的任务逻辑
result = argument * 2
return result
# 创建一个 ThreadPoolExecutor 对象
with concurrent.futures.ThreadPoolExecutor() as executor:
# 提交任务到线程池,并获取 Future 对象列表
# 这里的任务可以是任何可调用对象,这里使用了一个简单的函数作为示例
arguments = [1, 2, 3, 4, 5]
results = [executor.submit(your_task, arg) for arg in arguments]
# 获取每个任务的结果
for future in concurrent.futures.as_completed(results):
# 注意:as_completed() 返回的是 future 对象的生成器,它会在每个任务完成时产生一个 future
# 可以通过 future.result() 方法获取任务的结果
result = future.result()
print("Result:", result)
这个示例中,your_task
函数代表了你想要并行处理的任务。arguments
列表包含了传递给任务的参数。使用 executor.submit()
方法提交任务到线程池,并返回一个 Future
对象,代表了任务的执行状态和结果。然后通过 concurrent.futures.as_completed()
函数迭代 Future
对象,以获取每个任务的结果
2.与线程池不同,进程池中的每个任务都会在单独的进程中执行,这意味着它们具有独立的内存空间,因此适用于 CPU 密集型任务。但是需要注意的是,由于进程之间的通信开销比线程高得多,因此在某些情况下,多线程可能比多进程更有效
import concurrent.futures
def your_task(argument):
# 这是你想要并行处理的任务的代码
# 在这里编写你的任务逻辑
result = argument * 2
return result
# 创建一个 ProcessPoolExecutor 对象
with concurrent.futures.ProcessPoolExecutor() as executor:
# 提交任务到进程池,并获取 Future 对象列表
# 这里的任务可以是任何可调用对象,这里使用了一个简单的函数作为示例
arguments = [1, 2, 3, 4, 5]
results = [executor.submit(your_task, arg) for arg in arguments]
# 获取每个任务的结果
for future in concurrent.futures.as_completed(results):
# 注意:as_completed() 返回的是 future 对象的生成器,它会在每个任务完成时产生一个 future
# 可以通过 future.result() 方法获取任务的结果
result = future.result()
print("Result:", result)
-
资源消耗:
- 多线程:线程共享同一进程的内存空间,因此线程间的通信相对较快、开销较小。但是线程之间共享内存也可能导致数据竞争和同步问题。
- 多进程:每个进程有自己独立的内存空间,进程间的通信需要额外的开销,例如使用管道、共享内存或者队列。但是多进程避免了由于共享内存带来的竞争和同步问题。
-
并发性:
- 多线程:由于线程共享同一进程的资源,线程之间的切换开销比较小,适合于 I/O 密集型任务,例如网络请求或文件操作。
- 多进程:每个进程都有自己的独立资源,适合于 CPU 密集型任务,例如大量的计算或者数据处理任务
concurrent.futures.wait(futures)
函数用于等待给定的一组 futures
对象完成执行。在多线程或多进程的情况下,通常会将一组任务提交给线程池或进程池,并通过 executor.submit()
方法获取这些任务的 Future
对象列表。在这种情况下,你可能想要等待所有任务都完成后再继续执行下面的代码。
import concurrent.futures
def your_task(argument):
# 这是你想要并行处理的任务的代码
# 在这里编写你的任务逻辑
result = argument * 2
return result
# 创建一个 ThreadPoolExecutor 或 ProcessPoolExecutor 对象
with concurrent.futures.ThreadPoolExecutor() as executor:
arguments = [1, 2, 3, 4, 5]
futures = [executor.submit(your_task, arg) for arg in arguments]
# 等待所有任务完成
completed, not_completed = concurrent.futures.wait(futures)
# 处理已完成的任务结果
for future in completed:
result = future.result()
print("Result:", result)
# 处理未完成的任务,例如取消或重新提交
for future in not_completed:
# 取消未完成的任务
future.cancel()