python - 'TypeError("can't pickle generator objects"): Concurrent.future 与 Asyncio
问题描述
我想从 python 列表中的每个对象同时执行相同的实例方法。
我创建了一个 DataPipe 类,它下载页面并将结果存储在一个数组中。然后,当我下载完特定域的感兴趣链接时,我会生成这些页面,然后从页面中生成相应的项目。
该代码几乎可以按预期工作,现在我想同时从多个域下载。
class DownloadCommand(Command):
def __init__(self, domain):
self.domain = domain
self.request_config = {'headers': self.domain.get_header(), 'proxy': self.domain.get_proxy()}
self.data_pipe = DataPipe(command=self)
def execute(self):
# try:
for brand, start_urls in self.domain.start_url.items():
for start_url in start_urls:
# yield from self.data_pipe.get_item_divs(brand, start_url)
yield from self.data_pipe.get_item_divs(brand, start_url)`
目前,我正在按顺序执行此操作。
def scrape(self):
for domain in self.get_initial_domain_list():
yield from self.fetch_from_dom(domain)
def fetch_from_dom(self, domain):
self.set_current_domain(domain)
for start_url_values, brand, start_url in domain.command.execute():
for items in start_url_values:
yield [self.get_item_value(item_div) for item_div in items]
我尝试使用多线程这个应用程序,multiprocessing.pool.Pool
但它不适用于实例方法。然后当我使用pathos.multiprocessing import ProcessingPool
它时返回一个错误:
multiprocess.pool.MaybeEncodingError: Error sending result: '[<generator object fetch_from_dom at 0x7fa984814af0>]'. Reason: 'TypeError("can't pickle generator objects",)'
我想切换到asyncio
或concurrent.futures
但我不确定哪个会更好地做我想做的事情,如果它实际上可以在 python 中做到这一点(同时从列表中的对象执行实例方法)。任何人都可以帮忙吗?
解决方案
不能将 selenium 与 python 多处理一起使用,因为它会克隆内存。你可以尽量避免使用更简单的线程。但这是我的多处理解决方案
注意:self 是我的驱动程序,因为我在 Selenium 上实现了自定义类
#Exit function
def cleanup(self):
print("++cleanup()++")
try:
try:
self.close()
except Exception as e:
#print("except cleanup - 2 - self.close() -> %s" %e)
pass
try:
self.quit()
except Exception as e:
#print("except cleanup - 3 - self.quit() -> %s" %e)
pass
try:
self.dispose()
#print("Fake disabled dispose()")
except Exception as e:
#print("except cleanup - 4 - self.dispose() -> %s" %e)
pass
try:
self.service.process.send_signal(signal.SIGTERM)
except Exception as e:
#print("except cleanup - 1 - self.service.process.send_signal(signal.SIGTERM) -> %s" %e)
pass
except Exception as e:
print("Except - CLEANUP -> %s" %e)
#print(str(e))
pass
在脚本代码中
#Before start threads
browser.cleanup()
del browser
#Now start multiprocessing and instance browser on each subprocess
推荐阅读
- wordpress - Laravel 5.8 自定义电子邮件和密码列
- c++ - OpenAL alBufferData 调用时返回未知错误
- python - Python playsound 在 IDLE 中有效,但在 Thonny 中出现“no module called gi”错误;Ubuntu终端中的混合结果
- r - 组合重叠组以包含在 R 中的小提琴图/箱线图中
- jpa - QueryDSL Left Join 未与 JPA 实体正确映射
- python - Django 得到一个父母列表,每个父母都有自己的孩子
- python - 由于单引号和双引号,正则表达式不起作用
- c - 先进先出的流程实现系统
- json - 将来自 3rd 方 api 的 JSON 响应与 geodjango 一起使用
- angular - 角度自动完成 formInit 不填充我的值