我对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())。任何形式的帮助都非常感谢
答案 0 :(得分:0)
我找到了解决此问题的方法。 问题在于线程仍处于活动状态,等待与服务器的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()