线程池和进程池
基础
#线程池
from concurrent.futures import ThreadPoolExecutor
#进程池
from concurrent.futures import ProcessPoolExecutor
t_pool=ThreadPoolExecutor(3) #3代表该池子的最大并发数
p_pool=ProcessPoolExecutor(4)
两个池的接口用法几乎一样
wait_any和wait_all功能
import time
from concurrent.futures import ThreadPoolExecutor, as_completed, wait
def task(name):
print(f"Task {name} started")
# 模拟任务执行时间
time.sleep(1)
print(f"Task {name} completed")
return name
def wait_any():
with ThreadPoolExecutor(3) as executor:
futures = [executor.submit(task, i) for i in range(5)]
for future in as_completed(futures):
print(future.result())
def wait_all():
with ThreadPoolExecutor(3) as executor:
futures = [executor.submit(task, i) for i in range(5)]
# wait返回(已完成的任务列表,未完成的任务列表)
completed_futures,uncompleted_futures=wait(futures)
#此处completed_futures和futures应该相同
for future in completed_futures:
print(future.result())
Popen方法
import subprocess
# 创建多个子进程
processes = []
for i in range(5):
cmd = ['python', 'script.py',str(i)]
process = subprocess.Popen(cmd)
processes.append(process)
# 等待所有子进程执行完毕
for process in processes:
process.wait()
查看并发任务的异常信息
import logging
from traceback import format_exc
logging.error(format_exc)