在跑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()