如何在Python中并行执行多个函数并获取它们的返回值
Python 并行执行多函数并获取返回值
你的三个函数均为IO密集型操作(网络请求、浏览器交互),用线程池并行执行是最优选择——既能大幅缩短总耗时,又不会产生进程池的高开销。下面给出两种可行的实现方案:
方案一:使用 concurrent.futures.ThreadPoolExecutor
这是Python标准库中最简洁的并行实现方式,无需额外安装依赖:
from concurrent.futures import ThreadPoolExecutor from selenium import webdriver import requests def session_ID(): # 重要:每个线程需独立初始化WebDriver,避免线程安全问题 driver = webdriver.Chrome() try: driver.get('你的目标URL') sessionID = driver.execute_script('return ...') return sessionID finally: driver.quit() # 确保执行完成后关闭浏览器 def reCaptcha(): recaptcha_res = requests.get('你的reCaptcha请求URL') return recaptcha_res.text # 可根据需求返回具体内容,比如recaptcha_res.json() def hCaptcha(): hcaptcha_res = requests.get('你的hCaptcha请求URL') return hcaptcha_res.text def main(): # 创建线程池,线程数与待执行函数数量一致即可 with ThreadPoolExecutor(max_workers=3) as executor: # 提交三个函数到线程池,返回Future对象用于获取结果 future_session = executor.submit(session_ID) future_recaptcha = executor.submit(reCaptcha) future_hcaptcha = executor.submit(hCaptcha) # 获取每个函数的返回值,result()会阻塞直到对应函数执行完成 sessionID = future_session.result() recaptcha = future_recaptcha.result() hcaptcha = future_hcaptcha.result() print(sessionID, recaptcha, hcaptcha) if __name__ == "__main__": main()
关键注意点:
session_ID函数中必须在函数内部初始化WebDriver,不能共用全局实例——Selenium的WebDriver不是线程安全的,共用会导致各种异常。- 三个
result()的调用顺序不影响并行效果,因为三个函数已经在后台线程同时启动执行。
方案二:使用 multiprocessing 进程池(适用于特殊场景)
如果你的函数存在线程安全问题(比如依赖不支持多线程的老旧库),可以用进程池替代,但进程开销比线程大,IO密集场景下效率不如线程池:
from multiprocessing import Pool from selenium import webdriver import requests def session_ID(): driver = webdriver.Chrome() try: driver.get('你的目标URL') sessionID = driver.execute_script('return ...') return sessionID finally: driver.quit() def reCaptcha(): return requests.get('你的reCaptcha请求URL').text def hCaptcha(): return requests.get('你的hCaptcha请求URL').text def main(): with Pool(processes=3) as pool: # 用map批量提交任务,返回结果的顺序与任务提交顺序一致 results = pool.map(lambda func: func(), [session_ID, reCaptcha, hCaptcha]) sessionID, recaptcha, hcaptcha = results print(sessionID, recaptcha, hcaptcha) if __name__ == "__main__": main()
补充说明:
- 进程池模式下,每个进程会独立初始化Python解释器和WebDriver,内存占用更高,但完全规避了线程安全风险。
- 若
requests请求需要设置超时、代理等参数,直接在函数内部配置即可,不影响并行执行逻辑。
内容的提问来源于stack exchange,提问作者Katerina_GG
相关产品推荐
相关产品推荐

