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

