python - 请求挂在python中的线程
问题描述
我正在构建一个漏洞管理工具,我对 python 多处理模块有一个严重的问题。它获取一个 linux 包列表,然后通过调用 RedHat API 搜索每个包的可用 CVE。我正在使用 multiprocessing.dummy 来实现线程池来完成这项工作。问题是在成功调用 API 后,我的脚本挂起/冻结,我无法调试它。这是我的一段代码
from multiprocessing.dummy import Pool as ThreadPool
def check_vulnerability(package):
done.append(package)
try:
time.sleep(1)
headers = {'User-agent' : 'Mozilla/11.0'}
with requests_retry_session() as s:
s.headers.update(headers)
print "Processing package "+package+"=>"+str(float(len(done))/len(packages)*100)+"%"
req = requests.get('https://access.redhat.com/labs/securitydataapi/cve.xml?package='+package, headers = headers, verify=True)
if req.text != '':
soup = BeautifulSoup(req.text, 'xml')
else:
pass
except Exception as e:
#print "#################################################################################"
#print e
#print packages"#################################################################################"
#Some code to process req.text
def main():
start_time = time.time()
global packages
packages = fetch_packages_rpm() #list of strings ()
p = ThreadPool(int(results.thread))
all = p.map(check_vulnerability, packages)
在一些成功的打印之后,我的脚本挂起并且无法调试(我认为线程正在等待 ssl 握手或类似的东西,它在 waiter.aquire() 中)。任何形式的帮助都非常感谢
解决方案
我找到了解决这个问题的方法。问题是线程仍然活着,等待与服务器的 SSL 握手。我所做的是使用线程而不是线程池与 multiprocessing.dummy。然后,当服务器超时未响应时,使用带有超时的 join() 来终止线程。
for index, package in enumerate(packages):
t = threading.Thread(target=check_vulnerability, args=(package,))
threads.append(t)
t.daemon = True
t.start()
t.join(0.5)
t.isAlive()
推荐阅读
- php - 将博客类型(大)内容存储在 mysql 数据库上是否可取?
- gradle - Gradle build 执行两次测试用例
- javascript - 将 Javascript 数组转换为 MySQL 数组
- python - Django使用`mysql.connector.django`作为数据库ENGINE后,如何打印执行的SQL语句
- laravel - 错误:请求失败,状态码为 500 Laravel/Vue
- php - PHP 脚本在没有任何错误的情况下停止
- .net - 在 Azure Functions 中将字节数组转换为图像
- postgresql - Postgres 关键字 DEFAULT 未被识别为 EF 核心中的列值?
- azure-devops - 我应该在构建或发布管道的哪里运行测试?
- json - 发布 Jira 适用于 Python,但不适用于 PowerShell