【发布时间】:2021-11-20 16:14:07
【问题描述】:
我目前正在学习 python 的同时从事一个据说很简单的网络抓取项目。我有一个大约 70MB 的列表,其中包含我想要处理的几百万个 IP 地址 (sys.argv[1])。当然,并不是所有的都可以到达。
我正在尝试使用 concurrent.futures 并且目前遇到内存问题 - 最终导致整个进程被杀死。
现在,我按照here 的建议将我的未来分成两组(完成和未完成)。 我正在使用大约 100 个工作人员 (sys.argv[2]) 并且有 1GB 内存可用。
我虽然一旦用=> futures 1000 done 调用 future.results() 就会释放所有完成的期货?但是,它似乎只是在减慢进程(包括在进程被杀死之前填充内存)。
我在这里缺少什么?有关如何处理此问题的任何建议?
提前谢谢你。
我的代码如下:
import sys
import requests
import concurrent.futures
import urllib3
from lxml.html import fromstring
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def title(host):
try:
url="https://"+host
r = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'}, timeout=3, verify=False)
tree = fromstring(r.content.decode('utf-8'))
title = tree.findtext('.//title')
print(host+": "+title)
except:
pass
max=int(sys.argv[2])
with concurrent.futures.ThreadPoolExecutor(max_workers=max) as executor:
futures_done = set()
futures_notdone = set()
with open(sys.argv[1]) as f:
for line in f:
host = line.strip()
futures_notdone.add(executor.submit(title, host))
if len(futures_notdone) >= max:
done, futures_notdone = concurrent.futures.wait(futures_notdone, return_when=concurrent.futures.FIRST_COMPLETED)
futures_done.update(done)
for future in futures_done:
if len(futures_done) >= 1000:
future.result()
【问题讨论】:
-
编辑:线程似乎随着时间的推移而变慢。我让程序运行了几个小时。我会说函数(标题)以大约 20% 的初始启动速度运行。也许有些期货被卡住/没有被释放?
标签: python python-3.x multithreading python-multithreading concurrent.futures