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
相关产品推荐
相关产品推荐

