社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python渗透系列——TCP扫描器之多线程:threading模块(1)

洛柒尘 • 3 年前 • 124 次点击  
阅读 7

Python渗透系列——TCP扫描器之多线程:threading模块(1)

引言:

学了网络安全快一年了,都是学一会玩一会,感觉什么都没学进去,什么知识点都知道,但是一做题、一打比赛全部都要去谷歌和翻看自己以前的笔记,什么都没有记在脑子里。 在懵的时候突然看到网页上有一篇文章,这种情况可以写作博客,写的让新手都知道。这篇文章让我想起了我刚开始学的时候,刷知识点的时候都是一脸蒙,没有人带真的看不懂,所以我就加入写博客的队列中,把自己学习过程的细节全部写下来,写出一篇篇让新手通俗易懂的文章。在后续也写一些自己总结起来的笔记,方便做题渗透比赛的时候参考!!!!!

前言:

渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集, 而端口扫描就是信息搜集中至关重要的一个步骤。 通过端口扫描我们可以了解到目标主机都开放了哪些服务, 甚至能根据服务猜测可能存在某些漏洞。 但是端口有那么多,一个一个扫要多久呀!!!

在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 image.baidu.com/ ,如果我们想把 图片大量的保留下来,我们就需要到爬虫相关知识来爬取图片。 在Python爬虫中,爬取一张图片可能需要1秒,但如果爬取一百张呢,一千张、一万张呢? 那要多长时间呀。

以上两种脚本编写证明了学习多线程的必要性, 所以这几节我们将围绕多线程并发来学习,本节将讲解·threading如何使用


一、多线程的相关概念

程序、进程、线程的区别

  • 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。
  • 假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。(多核CPU就相当于有多个发电站,使好多车间同时运行)
  • 而一个车间可以有多个工人,他们协同完成一个任务。

这里就可以看出进程相当于车间,线程相当于工人,车间和工人都可以多个,一个车间代表一个进程,车间里有多个工人代表多个线程。

  • 车间中许多房间是工人共享的,比如很多房间工人都是可以随意进出的。这象征着一个进程的内存空间是共享的,每个线程都可以使用这些共享的内存。
  • 可是每个房间的面积都是不一样的。
  • 有些只能容纳一个人,比如厕所。同时只能容纳一个人(如果两个人的话,嘿嘿嘿!!!),里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
  • 所以进入厕所后会在外面亮灯提醒有人,等里面的人出来后你才能进去,而我们叫他它做互斥锁(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。
  • 还有些房间,可以容纳多人,不如饭堂。但厨房也有面积限制,比如最多10人,这时多的人就要在外面等待了。这好比某些内存区域,只能供给固定数目的线程使用。
  • 这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做信号量(Semaphore),在某种情况下叫做线程池,用来保证多个线程不会互相冲突。
  • 不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

总结:只能容纳一个人的叫使用互斥锁,能容纳多人的使用信号量。当然,还有其他的解决方法,这个放在后面一起细讲

信号量线程池的区别,使用线程池,实际工作线程由线程池创建;使用Seamphore,实际工作的线程由你自己创建。


二、线程的周期

线程的周期
各个状态说明:

  • 1.New(新建),新创建的线程进过初始化,进入**Runnable(就绪)**状态;
  • 2.Runnable(就绪),等待线程调度,调度后进入**Running(运行)**状态;
  • 3.Running(运行),线程正常运行,期间可能会因为某些情况进入Blocked(堵塞) 状态(同步锁;调用了sleep()join()方法进入Sleeping状态;执行wait() 方法进入Waiting状态,等待其他线程notify通知唤醒);
  • 4.Blocked(堵塞),线程暂停运行,解除堵塞后进入**Runnable(就绪)**状态 重新等待调度;
  • 5.Dead(死亡):线程完成了它的任务正常结束或因异常导致终止;

三、并行和并发

并行是同时处理多个任务,而并发则是处理多个任务,而不一定要同时。 并行可以说是并发的子集。


四、同步和异步

  • 同步的意思就是说,来第一个点菜,点了个鱼,好, 厨师去捉鱼杀鱼,过了半小时鱼好了给第一位客人,开始下位一位客人,就这样一个一个来,按顺序来
  • 异步呢,异步的意思就是来第一位客人,点什么,点鱼,给它一个牌子,让他去一边等吧,下一位客人接着点菜,点完接着点让厨师做去吧,哪个的菜先好就先端出来

同步的优点是:同步是按照顺序一个一个来,不会乱掉,更不会出现上面代码没有执行完就执行下面的代码, 缺点:是解析的速度没有异步的快;

异步的优点是:异步是接取一个任务,直接给后台,在接下一个任务,一直一直这样,谁的先读取完先执行谁的, 缺点:没有顺序 ,谁先读取完先执行谁的 ,会出现上面的代码还没出来下面的就已经出来了,会报错;


五、死锁,饥饿与活锁

  • 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
  • 活锁:是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。这样你让我,我让你,最后两个线程都无法使用资源。
  • 饥饿:是指如果线程T1占用了资源R,线程T2又请求封锁R,于是T2等待。T3也请求资源R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求......,T2可能永远等待。

六、守护线程

后台线程,是一种为其他线程提供服务的线程。 如果你设置一个线程为守护线程,,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。如果你的主线程在退出的时候,不用等待那些子线程完成。 通俗的讲:守护线程就是告诉主进程你做就好了,不要等我!差不多等于刺客经常抢完人头就把队友买了的意思!


七、python中的GIL

GIL是什么,它叫全局解释器锁GIL(Global Interperter Lock),GIL并不是Python语言的特性,它是在现实CPython解释器时引用的一个概念。GIL只在Python解释器上存在。作用是保证同一时间内只有一个线程在执行。 是不是觉得跟互斥锁差不多,但其实还是有差别的。

  • 线程互斥锁Python代码层面的锁,解决Python程序中多线程共享资源的问题。
  • GILCPython解释层面的锁,解决解释器中多个线程的竞争资源问题。

那这个python有了GIL不就变成单线程了吗,那还要多线程干嘛,不如去用多进程呀!! 不不不,虽然在CPU密集型任务中使用多进程比使用多线程跟节省资源,但是在IO密集型任务中,多线程比多进程效率高。 所以其实是各有优点


八、CPU密集型和IO密集型

在上面讲到了在CPU密集型IO密集型中那个使用多进程更好,那我们就再来讲一下CPU密集型和IO密集型的区别。

  • CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。
  • IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。

往简单说,意思就是

  • CPU 密集型:程序比较偏重于计算,需要经常使用 CPU 来运算。也就是说CPU计算占主要的任务,CPU一直处于满负荷状态。
  • I/O 密集型:顾名思义就是程序需要频繁进行输入输出操作。指磁盘IO、网络IO占主要的任务,计算量很小。

在python中CPU密集型任务主要使用多进程。例子:复杂的加减乘除科学计算程序计算圆周率对视频进行高清解码等大型运算。 而IO密集型任务适合使用多线程。例子:文件处理爬虫


九、Python多线程可能使用的库

学习多线程基础用的得到的是threading和queue

  • thread——比较老的模块了,被threading给代替了
  • threading——多线程使用的库
  • **multiprocessing **——多进程使用的库
  • queue——提供同步的、线程安全的队列类
  • time-用来控制时间

下一章将会详细讲解threading怎么用

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/63096
 
124 次点击