python 进程池ThreadPoolExecutor 池里的子进程取名字,例子

在跑Selenium任务的时候,供用户设置 最大进程数量,同时 selenuim不能同时开启两个userdata ,所以需要给进程设置下名字,不能同时跑两个userdata

同时该示例监听了程序停止的型号,把进程池里的程序也退出

import time
import threading
import signal
from concurrent.futures import ThreadPoolExecutor
from src.selenium.init import init_driver

# 全局停止标志
stop_event = threading.Event()
schedule_thread = None

def schedule():
    print('定时任务启动')
    
    def task(name):
        if stop_event.is_set():
            return
            
        # print(f"任务 {name} 开始执行")
        try:
            driver = init_driver()
            driver.get('https://www.baidu.com')
            time.sleep(5)  # 模拟耗时操作
            driver.quit()
            # print(f"任务 {name} 完成")
        except KeyboardInterrupt:
            print(f"任务 {name} 被中断")
    
    try:
        # 修改ThreadPoolExecutor初始化部分
        with ThreadPoolExecutor(max_workers=3, thread_name_prefix='工作线程') as executor:
            while not stop_event.is_set():
                # 提交4个任务,并自定义线程名称
                for i in range(4):
                    task_name = f"任务-{i}"
                    future = executor.submit(
                        lambda name: (
                            setattr(threading.current_thread(), 'name', f"{executor._thread_name_prefix}_{name}"),
                            task(name)
                        )[-1],
                        task_name
                    )
                    setattr(future, 'task_name', task_name)
                
                print("所有任务已提交,线程池开始处理")
                #可以知道当前的线程数
                print(f"当前线程数: {len(executor._threads)}")
                #获取当前池里的所有名称
                thread_names = []
                for t in executor._threads:
                    print(f"线程名称: {t.name}")  # 输出如: 工作线程_任务-1
                    thread_names.append(t.name)
                # print(f"当前池里的所有名称: {thread_names}")
                # 等待2秒或直到停止事件被设置
                stop_event.wait(2)
                
    except KeyboardInterrupt:
        print("\n接收到终止信号")
    finally:
        stop_event.set()
        print("正在清理线程池...")

# 信号处理函数
def handle_signal(signum, frame):
    print(f"\n接收到信号 {signum}, 准备停止...")
    stop_event.set()
    import os
    os._exit(0)  # 立即退出进程
# 注册信号处理
signal.signal(signal.SIGINT, handle_signal)
signal.signal(signal.SIGTERM, handle_signal)

# 定时任务函数
def run_schedule():
    schedule_thread = threading.Thread(target=schedule,name='定时任务')
    schedule_thread.daemon = True
    schedule_thread.start()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脚本大王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值