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

Process.Join()调用存在延迟?Python多进程爬虫场景疑问

Python多进程爬虫子进程结束与主进程join延迟问题

我在Python多进程爬虫场景中运行多个爬虫进程,其中一个爬虫进程代码如下:

def scraper_1(urls, start_time, ret_list, profile):
    sb = Driver(uc=True, user_data_dir=profile, headless2=True)

    card_dict = {}
    for url in urls:
        sb.default_get(url[1])
        # functional code that fills card_dict

    sb.quit()
    ret_list.append(card_dict)
    print(f'###########    SCRAPER 1 FINISHED       ########### {"{:.2f}".format(time() - start_time)}')

管理爬虫进程的scrape()函数代码:

def scrape(start_time):
    print(f'###########    STARTED  SCRAPING    ########### {"{:.2f}".format(time() - start_time)}')

    manager = Manager()
    ret_list = manager.list()

    path1 = os.path.abspath("./profiles")

    p_scraper1 = Process(target=scraper_1, args=(urls1, start_time, ret_list, path1))

    p_scraper1.start()

    p_scraper1.join()
    print(f'scraper 1 joined {"{:.2f}".format(time() - start_time)}')

预期子进程打印的SCRAPER 1 FINISHED与主进程打印的scraper 1 joined应几乎同时出现,但两者间存在近10秒延迟,请问该现象是否正常,或是我忽略了什么?


可能的原因及解决方向

  • 浏览器驱动资源未完全释放:调用sb.quit()后,undetected-chromedriver对应的Chrome进程可能没有立刻终止,后台在做缓存清理、套接字关闭等操作,这个过程会占用时间。可以手动检查系统进程里的Chrome实例,或者在sb.quit()后添加强制杀进程的逻辑(比如用psutil找到相关进程并终止)。
  • 共享列表的IPC开销:ret_list.append(card_dict)使用的是Manager.list(),这是跨进程共享数据结构,底层依赖进程间通信。如果card_dict数据量较大,序列化和传输的过程会产生明显耗时。可以把ret_list.append()移到打印语句之后,或者改用Pipe这类轻量IPC方式验证是否是这个环节导致的延迟。
  • 控制台输出缓冲:子进程的print输出可能因为系统缓冲没有立即显示,导致你看到的SCRAPER 1 FINISHED时间晚于子进程实际结束时间,而主进程join是等子进程真正结束才执行,看起来像是有延迟。给print加上flush=True强制刷新输出:
    print(f'###########    SCRAPER 1 FINISHED       ########### {"{:.2f}".format(time() - start_time)}', flush=True)
    
  • 子进程隐式收尾工作:Python子进程退出时会自动清理全局资源、关闭文件句柄等,如果爬虫代码里有未显式关闭的网络连接、文件等,这些清理过程也会消耗时间。检查代码里是否有遗漏的资源释放操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:02:26