You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多进程场景下如何让同时执行open_browser的进程排队且不中断其他进程

实现方案

核心逻辑是使用Python multiprocessing 模块提供的跨进程互斥锁,仅限制open_browser函数的并发执行,监控流程不受任何影响。

实现步骤

  • 主进程初始化全局互斥锁,将锁对象传递给所有子进程
  • 改造open_browser函数,执行前先获取锁,执行完成后自动释放锁,保证同一时间只有1个进程执行该函数
  • 监控用的watch函数不涉及锁操作,正常并发运行即可

示例代码

import multiprocessing
from multiprocessing import Lock
import pyautogui
from selenium import webdriver
# 其余依赖按实际需求导入

# 改造后的open_browser函数
def open_browser(channel_config, lock: Lock):
    # 进入函数先申请锁,其他调用该函数的进程会在此排队等待
    with lock:
        # 原有打开浏览器、排布窗口、加载直播流、pyautogui点击的全部逻辑
        driver = webdriver.Chrome()
        driver.set_window_size(1920, 1080)
        driver.set_window_position(channel_config['x_pos'], channel_config['y_pos'])
        driver.get(channel_config['stream_url'])
        # 你的pyautogui点击逻辑
        pyautogui.click(xxx, xxx)
        return driver

# 子进程工作函数
def worker(channel_config, lock: Lock):
    while True:
        # 打开浏览器阶段:受锁控制,排队执行
        driver = open_browser(channel_config, lock)
        # 监控阶段:不涉及锁,所有进程可独立并行运行
        watch(driver, channel_config)
        # 流失效后关闭浏览器,进入下一轮重启流程
        driver.quit()

if __name__ == "__main__":
    # 主进程创建全局互斥锁
    open_browser_lock = multiprocessing.Lock()
    # 你的频道配置列表
    channel_list = [
        {"x_pos": 0, "y_pos":0, "stream_url": "xxx"},
        {"x_pos": 1920, "y_pos":0, "stream_url": "yyy"}
    ]
    processes = []
    for config in channel_list:
        p = multiprocessing.Process(target=worker, args=(config, open_browser_lock))
        processes.append(p)
        p.start()
    
    for p in processes:
        p.join()

注意事项

  • 必须使用with lock的上下文管理器写法,即使open_browser执行过程中抛出异常也会自动释放锁,避免出现死锁
  • 建议优先用Selenium自带的set_window_position、set_window_size方法固定窗口位置和尺寸,减少pyautogui的点击依赖,进一步降低操作错误概率
  • 如果使用进程池实现,需要将锁作为初始参数通过initializer传递给进程池内的所有子进程

内容的提问来源于stack exchange,提问作者Dava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:15:02