我正在尝试在python中使用硒处理多重处理。我的代码如下:
from selenium import webdriver
from multiprocessing import Pool
import xlwings as xw
driver = webdriver.Chrome('chromedriver.exe')
driver.get("https://example.com")
wb = xw.Book('my_file.xlsm')
sht = wb.sheets["Sheet1"]
final_list = []
search = driver.find_element_by_id("ContentPlaceHolder1_txtByName")
for item in search:
z = item.find_element_by_class_name("valuetext")
info = z.find_element_by_tag_name("span")
final_list.append(info.text)
def automate(num):
col = num
list_item = final_list[num]
sht.range(1, col).value = each
if __name__ == '__main__':
p = Pool(processes=4)
data = p.map(automate,range(1,20))
我遇到的问题是,重新打开该网页的4个过程中的每个过程,我不明白为什么。如果p.map
仅针对automate
函数,那么为什么其余代码会在每个进程中运行?
我还是多处理的新手,所以不确定这是否是它的工作方式。是否有另一种方法可以确保进程仅针对函数本身,还是可以使用线程? >
答案 0 :(得分:0)
在multiprocessing docs的示例中,他们建议将Pool
与上下文管理器一起使用,即
with Pool(processes=4) as pool:
print(pool.map(f, range(10))
在您的使用和文档之间,我立即看到了最突出的区别。我看不出它的详细说明,但我根据您的观察推断,该框架正在其所产生的每个过程中“重新导入”(可以这么说)您的模块,这导致了您报告的行为:多个浏览器打开。
为防止这种情况,我建议将初始化代码放在函数中;如果要共享final_list
,则可能应该使用queue或multiprocess
支持的其他数据结构来共享。