【发布时间】:2022-01-23 13:54:52
【问题描述】:
我正在尝试多进程 selenium,其中每个进程都由一个 selenium 驱动程序和一个会话产生(每个进程都与不同的帐户连接)。
我有一个要访问的 URL 列表。 每个 URL 需要由其中一个帐户访问一次(无论是哪个帐户)。
为了避免一些讨厌的全局变量管理,我尝试使用 initializer 的 multiprocessing.pool 的类对象初始化每个进程。
在那之后,我不知道如何将任务分配给进程,因为我知道每个进程使用的函数必须在类中。
这是我正在尝试做的简化版本:
from selenium import webdriver
import multiprocessing
account = [{'account':1},{'account':2}]
class Collector():
def __init__(self, account):
self.account = account
self.driver = webdriver.Chrome()
def parse(self, item):
self.driver.get(f"https://books.toscrape.com{item}")
if __name__ == '__main__':
processes = 1
pool = multiprocessing.Pool(processes,initializer=Collector,initargs=[account.pop()])
items = ['/catalogue/a-light-in-the-attic_1000/index.html','/catalogue/tipping-the-velvet_999/index.html']
pool.map(parse(), items, chunksize = 1)
pool.close()
pool.join()
问题出现在pool.map 行,子进程内没有对实例化对象的引用。
另一种方法是在初始化期间分发 URL 和解析,但这会非常讨厌。
有没有办法做到这一点?
【问题讨论】:
-
你试过用multiprocessing.Queue吗?
-
我不熟悉队列,你有什么建议?
-
multiprocessing.Queue的主要噱头是它可以被多个进程安全使用,我希望示例对您有所帮助,请参阅一个示例,展示如何使用队列将任务提供给收集工作进程并收集结果: 可在multiprocessingdocs
标签: python python-3.x multithreading selenium multiprocessing