python-网络安全编程第六天(threading多线程模块&Queue模块&subprocess模块)
前言
昨天晚上9点多就睡了 2点起来没睡意。。。 那就学习吧emmmm ,拿起闲置几天的python课程学习。学习到现在5.58了 总结下 继续开始学习新的内容
多多线程?
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
多线程类似于同时执行多个不同程序,多线程运行有如下优点:
- 使用线程可以把占据长时间的程序中的任务放到后台去处理。
- 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
- 程序的运行速度可能加快
- 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
- 线程可以被抢占(中断)
- 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。
python多线程-引入threading模块
threading模块用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。
threading模块提供的类:
Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local
import threading
线程模块
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(): 设置线程名。
python多线程-通过threading.Thread()创建线程
- 通过threading.Thread()创建线程。其中target接收的是要执行的函数名字,args接收传入函数的参数
- eg:
import threading
import time def xiaohua(n):
print("xiaohua:%s"%(n))
time.sleep(2)#增加延迟可以看到效果 #创建2个线程
t1=threading.Thread(target=xiaohua,args=(2,))
t2=threading.Thread(target=xiaohua,args=(3,)) #启动2个线程
t1.start()
t2.start()程序运行后,主线程从上到下依次执行,在t1,t2两个线程启动后,与主线程并行,抢占CPU资源。xiaohua函数内部我们增加了2秒的延迟 正常清空下我们执行依次xiaohua函数第一个print很快第二个print要等上两秒 此时我们用的是多线程 所以这两行结果同时打印。
- eg2:
import threading
import time def fun(key):
print("Hello %s:%s"%(key,time.ctime())) def main():
threads=[]
key=['xiaohua','dawang','666'] threadscount=len(key) for i in range(threadscount):
t=threading.Thread(target=fun,args=(key[i],))#创建新线程
threads.append(t)#添加线程到线程列表 for i in range(threadscount):
threads[i].start() #启动线程 for i in range(threadscount):
threads[i].join()#等待所有线程完成
if __name__=='__main__':
main()
python-Queue模块
Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。
- Queue.qsize() 返回队列的大小
- Queue.empty() 如果队列为空,返回True,反之False
- Queue.full() 如果队列满了,返回True,反之False
- Queue.full 与 maxsize 大小对应
- Queue.get([block[, timeout]])获取队列,timeout等待时间
- Queue.get_nowait() 相当Queue.get(False)
- Queue.put(item) 写入队列,timeout等待时间
- Queue.put_nowait(item) 相当Queue.put(item, False)
- Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
- Queue.join() 实际上意味着等到队列为空,再执行别的操作
Queue模块-FIFO队列
class Queue.Queue(maxsize=0)
FIFO即First in First Out,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。
import queue
Queue=queue.Queue() for i in range(6):
Queue.put(i) while not Queue.empty():
print(Queue.get())
执行结果
Queue模块-LIFO队列
class Queue.LifoQueue(maxsize=0)
LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上
import queue
Queue=queue.LifoQueue() for i in range(6):
Queue.put(i) while not Queue.empty():
print(Queue.get())
执行结果:
python-subprocess模块
创建Popen类的实例对象
res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
cmd:标准像子进程传入需要执行的shell命令,如:ls -al
shell:如果这个参数被设置为True,程序将通过shell来执行。
subprocess.PIPE:在创建Popen对象时,subprocess.PIPE可以初始化为stdin, stdout或stderr的参数,表示与子进程通信的标准输入流,标准输出流以及标准错误。
subprocess.STDOUT:作为Popen对象的stderr的参数,表示将标准错误通过标准输出流输出。
import subprocess
obj = subprocess.Popen(r'dir D:\flin',shell=True, # 可以执行系统命令,这里会创建独立的管道,返回其结果
stdout=subprocess.PIPE, # 输出结果
stderr=subprocess.PIPE, # 错误信息
stdin=subprocess.PIPE) # 标准输入 print(obj.stdout.read().decode('gbk')) # 打印执行结果
python综合运用
多线程C段扫描py
import threading
import queue
from subprocess import Popen,PIPE
queue=queue.Queue()
print(queue)
class DoRun(threading.Thread):
def __init__(self,queue):
threading.Thread.__init__(self)
self._queue=queue def run(self):
while not self._queue.empty():
ip=self._queue.get()
#print(ip)
check_ping=Popen("ping "+ip,stdin=PIPE,stdout=PIPE)
data=check_ping.stdout.read()
if 'TTL' in str(data):
print(ip+"is UP") def main():
threads=[]
threads_count=10 for i in range(1,255):
queue.put('101.201.65.'+str(i)) for i in range(threads_count):
threads.append(DoRun(queue)) for i in threads:
i.start() for i in threads:
i.join() if __name__=='__main__':
main()
# coding=utf-8
import threading, queue, time, urllib
from urllib import request
baseUrl = 'http://www.pythontab.com/html/pythonjichu/'
urlQueue = queue.Queue() for i in range(2,10):
url=baseUrl+str(i)+'.html'
urlQueue.put(url)
print(url) def fetchUrl(urlQueue):
while True:
try:
url=urlQueue.get_nowait()#相当queue.get(False)
i=urlQueue.qsize()#返回队列的大小
except Exception as e:
break
print('当前线程名%s,url:%s'%(threading.currentThread().name,url));
try:
response=urllib.request.urlopen(url)
responseCode=response.getcode()
except Exception as e:
continue
if responseCode==200:
#抓取内容的数据处理可以放到这里
# #为了突出效果, 设置延时
time.sleep(1) if __name__=='__main__':
startTime=time.time()
threads=[]
threadNum=4 for i in range(0,threadNum):
t=threading.Thread(target=fetchUrl,args=(urlQueue,))
threads.append(t) #将线程加入到容器
print(threads) for t in threads:
t.start()
for t in threads:
t.join() endTime=time.time()
print('time=%s'%(endTime-startTime))
参考学习:https://www.cnblogs.com/tkqasn/p/5700281.html
https://www.runoob.com/python/python-multithreading.html
https://www.cnblogs.com/itogo/p/5635629.html
python-网络安全编程第六天(threading多线程模块&Queue模块&subprocess模块)的更多相关文章
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- Python并发编程系列之多线程
1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...
- Python并发编程二(多线程、协程、IO模型)
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...
- 《Python核心编程》 18.多线程编程(一)
一进程和线程 1参考链接: http://www.zhihu.com/question/25532384 中OF小工和zhonyong 的回答 总结他们两的回答: 引言: 1.电脑的运行,在硬件上是C ...
- python学习笔记(threading多线程)
博主昨天优化了接口框架想着再添加些功能 想到对接口的性能压力测试 在工作过程中之前都是使用的工具 如:loadrunner.jmeter 想着这次准备用python实现对接口的性能压力测试 首先要实现 ...
- python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)
1.队列(queue) 用法: import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里 作用: 1)解耦 2)提高效率 class qu ...
- random模块、os模块、序列化模块、sy模块s、subprocess模块
random随机数模块 random.random( ) 随机产生一个0-1之间的小数 print(random.random()) # 0.31595547439342897 random.rand ...
- Python并发编程之线程池/进程池--concurrent.futures模块
一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...
- Python并行编程(九):线程通讯queue
1.基本概念 当线程之间要共享资源或数据的时候,可能变的非常复杂.Python的threading模块提供了很多同步原语,包括信号量,条件变量,事件和锁.如果可以使用这些原语的话,应该优先考虑使用这些 ...
随机推荐
- js 值类型与引用类型
说明之前先提一个提问题,看一下你是怎么理解的 1. 值类型 简单的数据类型,存放在栈中 var num = 100; var num2 = num; num += 100; console.log(n ...
- bash xshell 特性
1.tab键补全 2.命令行常用快捷键: ctrl键+ c #取消当前操作 ctrl键+ d #退出当前用户登录 ctrl键+ a #光标移动到光标所在行的行首 ctrl键+ e ...
- js根据ip地址获取城市地理位置
一.使用js根据ip获取地址位置 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>& ...
- Redis---03Redis事务
一.Redis事务 1.简述: Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断 2.作用: 主要作用就是串联多 ...
- JAVA学习第一阶段(1)
java入门第一阶段 1.在java中接受并保存用户输入的值: (1)import java.util.Scanner//引入包 (2)Scanner input=new Scanner (Syste ...
- NB-IoT窄带物联网技术的四大优势
NB-IoT是指窄带物联网(Narrow Band -Internet of Things)技术,是IoT领域一个新兴的技术,支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWA) ...
- MongoDB下载安装与配置
一.下载与安装 1.进入mongodb官网,try->download->community找到下载.或者直接在地址栏输入:https://www.mongodb.com/try/down ...
- python的高阶函数(map,filter,sorted,reduce)
高阶函数 关注公众号"轻松学编程"了解更多. 1.MapReduce MapReduce主要应用于分布式中. 大数据实际上是在15年下半年开始火起来的. 分布式思想:将一个连续的字 ...
- MIT黑科技:通过手机记录的咳嗽数据检测是否感染新冠病毒
这次的新冠状病毒虽然没有2002年的SARS破坏力那么强悍,但其可怕之处是长时间的无症状潜伏,使得被感染者在不知情的情况下,将病毒散播出去.如果没有强有力的防疫手段,病毒的传播几乎难以控制.而防止病毒 ...
- 剑指offer之顺序打印数组
算法的要求为: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打 ...