您的位置:首页 > 编程语言 > Python开发

python多线程——采集ip并验证

2017-11-01 12:52 423 查看
  Python因GIL的设计使得单CPU同一时刻只能执行一个线程,所以多线程在Python中主要用于IO较多的场景。前段时间需要采集一些免费IP代理,就应用多线程对采集来的代理进行目标网站的连通性进行批量验证。

  Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。

threading 模块提供的其他方法:

threading.currentThread(): 返回当前的线程变量。

threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:

run(): 用以表示线程活动的方法。

start():启动线程活动。

join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。

isAlive(): 返回线程是否活动的。

getName(): 返回线程名。

setName(): 设置线程名。

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

#import ......
def mt_validate(ip, port, target_urls):
"""
param:ip:
param:port:
param:target_urls: list
return:
"""
for i in len(target_urls):
exec('validate%d = 0' %i)
for i, target_url in enumerate(target_urls):
try:
r = requests.get(target_url, proxies={"http": "http://%s:%s" % (ip,    port), "https": "https://%s:%s" % (ip, port)}, timeout=8 , headers={})
except Exception:
pass
else:
if r.status_code == 200:
exec('validate%d = 1' %i)

validate = reduce(lambda x, y: x+y, [eval('validate%d' %i) for i in len(target_urls)])
#if validate!='0'*len(target_urls):
#......

#......
while True:
if threading.active_count() < 200:
t = threading.Thread(target=mt_validate, args=(ip, port))
t.start()
logging.log(threading.active_count())
break
else:
time.sleep(0.3)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 多线程 ip代理