线程池和进程池

基础

#线程池
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)