1、学习目标

线程池使用

2、编程思路

2.1 代码原理

线程池是预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中。这些线程都是处于睡眠状态,即均为启动,不消耗 CPU,而只是占用较小的内存空间。当请求到来之后,缓冲池给这次请求分配一个空闲线程,把请求传入此线程中运行,进行处理。当预先创建的线程都处于运行 状态,即预制线程不够,线程池可以自由创建一定数量的新线程,用于处理更多的请求。当系统比较闲的时候,也可以通过移除一部分一直处于停用状态的线程。

一个典型的线程池,应该包括如下几个部分:

1、线程池管理器(ThreadPool),用于启动、停用,管理线程池

2、工作线程(WorkThread),线程池中的线程

3、请求接口(WorkRequest),创建请求对象,以供工作线程调度任务的执行

4、请求队列(RequestQueue),用于存放和提取请求

5、结果队列(ResultQueue),用于存储请求执行后返回的结果

2.2 编写细节

  • 1、定制线程数

ThreadPool(poolsize)

例如定制20个线程数:

ThreadPool(20)
  • 2、创建要开启多线程的函数

makeRequests(some_callable, list_of_args, callback)

some_callable:开启多线程的函数

list_of_args:函数相关参数

callback:回调函数

  • 3、运行多线程的请求扔进线程池

第三步将多线程请求丢进线程池,官方说明是一行代码:

[pool.putRequest(req) for req in requests]

这行代码如果用简单容易理解的编写方式去写那就相当于:

for req in requests:
pool.putRequest(req)

然后丢进线程池后,还有一个退出的函数。

pool.wait()

例子:

>>> pool = ThreadPool(poolsize)                                        # 定制线程数
>>> requests = makeRequests(some_callable, list_of_args, callback) # 创建要开启多线程的函数
>>> [pool.putRequest(req) for req in requests] # 将多线程的请求扔进线程池
>>> pool.wait() # 等待所有的线程完成工作后退出

3 实现代码


#!/usr/bin/env python
# -*- coding:utf-8 -*- import json
import threading
import requests
import urllib2
import sys
import threading
from time import ctime,sleep
import threadpool # 主要执行函数
def main():
f = open("target.txt")
line = f.readlines()
global g_list
g_list = []
urllist = []
for url in line:
url = url.rstrip() # 读取文本
urllist.append(url) # 保存url的列表
thread_requestor(urllist) # 线程池函数
f = open('vulurl.txt','w')
for q in g_list: # 保存线程回调函数的值到vulurl.txt中
f.write(q+"\n")
f.close() # 回调函数的结果保存到g_list数组中
def res_printer(res1,res2):
if res2:
#print ('"线程返回的地址 = " %s ')% res2
g_list.append(res2)
else:
pass # 线程池函数
def thread_requestor(urllist):
pool = threadpool.ThreadPool(200) # 线程池数量
reqs = threadpool.makeRequests(getScan,urllist,res_printer) # 使用线程池
[pool.putRequest(req) for req in reqs] # 简写 for req in reqs pool.putRequest(req)
pool.wait() # 检测HTTP状态码函数
def getScan(url):
try:
requests.packages.urllib3.disable_warnings() # 忽略HTTPS连接错误的警告
status = requests.get(url, proxies=None, timeout=3,verify=False) # 获取HTTP状态码
print "scanning " + url + "\n" # 正在扫描的地址
if status.status_code == 200: # 访问成功的网站可以返回
return url
else:
pass
except:
pass if __name__ == "__main__":
main()

4、参考文章

python(13)多线程:线程池,threading

http://www.cnblogs.com/lovychen/p/5411743.html

Threadpool

https://chrisarndt.de/projects/threadpool/

【Python】多线程-线程池使用的更多相关文章

  1. C#多线程--线程池(ThreadPool)

    先引入一下线程池的概念: 百度百科:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行, ...

  2. linux C 多线程/线程池编程 同步实例

    在多线程.线程池编程中经常会遇到同步的问题. 1.创建线程 函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, ...

  3. Python的线程池实现

    # -*- coding: utf-8 -*- #Python的线程池实现 import Queue import threading import sys import time import ur ...

  4. Python之路【第八篇】python实现线程池

    线程池概念 什么是线程池?诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务.构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就 ...

  5. python自定义线程池

    关于python的多线程,由与GIL的存在被广大群主所诟病,说python的多线程不是真正的多线程.但多线程处理IO密集的任务效率还是可以杠杠的. 我实现的这个线程池其实是根据银角的思路来实现的. 主 ...

  6. [python] ThreadPoolExecutor线程池 python 线程池

    初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程 ...

  7. 《Python》线程池、携程

    一.线程池(concurrent.futures模块) #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 P ...

  8. [python] ThreadPoolExecutor线程池

    初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程 ...

  9. java多线程--线程池的使用

    程序启动一个新线程的成本是很高的,因为涉及到要和操作系统进行交互,而使用线程池可以很好的提高性能,尤其是程序中当需要创建大量生存期很短的线程时,应该优先考虑使用线程池. 线程池的每一个线程执行完毕后, ...

随机推荐

  1. day31 作业试题讲解

    #__author__: Administrator #__date__: 2018/8/8 # 基础知识 # 1.文件操作有哪些模式?简述作用 # r w a 至少你要说出这三个 # rb wb a ...

  2. centos Install Docker

    安装必备软件 $ yum -y install iptables iptables-services net-tools vim wget $ wget -P ~ https://github.com ...

  3. CF1101D GCD Counting(数学,树的直径)

    几个月的坑终于补了…… 题目链接:CF原网  洛谷 题目大意:一棵 $n$ 个点的树,每个点有点权 $a_i$.一条路径的长度定义为该路径经过的点数.一条路径的权值定义为该路径经过所有点的点权的 GC ...

  4. 字符串格式化format方法

    通过位置参数传参 print('{}, {}'.format('KeithTt', 18)) # KeithTt, 18 位置参数可以通过索引调用 print('{1}, {0}'.format('K ...

  5. bug8 eclipse项目导入到myeclipse时 Target runtime com.genuitec.runtime.generic

    1.新导入的工程,出问题很大可能是jdk的版本问题导致,检查一下,发现jdk果然不一致,修改了jdk版本,但异常没有消除 2.网上查询下解决方案,原来在工程目录下的settings,有个文件也需要修改 ...

  6. iptables后,外网访问网站可以,内网无法访问【已解决】

    最近,到处看到有人问这个问题,怎么以前没人问,现在这么多人问呢?前两天我还在华为的论坛上仔细的说了这个问题,现在复制到这边来.希望能帮助大家理解这个问题. 这是个理论问题,我们先从NAT讲起:NAT有 ...

  7. urllib.parse.quote

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  8. ansible 循环与条件判断when

    普通循环 with_itemes 变量组 { item } 循环变量 示例 - name: 覆盖配置文件 copy: src=/root/{{ item }} dest=/root/test/{{ i ...

  9. 远程升级云服务器系统 CentOS 6.x 至 CentOS 7.x

    由于docker-ce不再支持centos6,所以觉得吧系统升级为centos7,以下是踩坑的过程 1.添加源 /etc/yum.repos.d/upgrade.repo [upgrade] name ...

  10. SQL2008.sa'登录失败(错误18456)

    其实不仅仅是2008,高版本的也有这个问题.网上一大堆解决这个问题的方法,无非就是启动这个,启用那个.这里我讲些不一样的. 当你开启了TCP协议之后,需要去Windows防火墙哪里写一下入站规则,如图 ...