Python 线程池扫描端口

作者: aries 分类: Python 发布时间: 2012-10-31 19:54 ė 1366次浏览 6 0评论

昨天纠结了一会儿线程池的问题,终于可以使这个线程池可用了,真切的感受到了多线程的执行速度确实很犀利,原来的单线程端口扫描那个速度实在不敢恭维,换
成多线程之后马上有了数量级的飞跃(当然看你定义线程数的大小,不能太大,否则线程的额外开销会严重影响性能,过犹不及),下面是代码部分:

from socket import *
from threading import Thread
from Queue import Queue

def scan(ip,port):
s=socket(AF_INET,SOCK_STREAM)
result=s.connect_ex((ip,port))
if(result==0):
print 'Port %d: OPEN' % port
s.close()

class Worker(Thread):
def init(self,taskQueue):
Thread.init(self)
self.setDaemon(True)
self.taskQueue=taskQueue
self.start()

<span class="highlight-k">def</span> <span class="highlight-nf">run</span><span class="highlight-p">(</span><span class="highlight-bp">self</span><span class="highlight-p">):</span>
    <span class="highlight-k">while</span> <span class="highlight-kc">True</span><span class="highlight-p">:</span>
        <span class="highlight-k">try</span><span class="highlight-p">:</span>
            <span class="highlight-n">callable</span><span class="highlight-p">,</span><span class="highlight-n">args</span><span class="highlight-p">,</span><span class="highlight-n">kwds</span><span class="highlight-o">=</span><span class="highlight-bp">self</span><span class="highlight-o">.</span><span class="highlight-n">taskQueue</span><span class="highlight-o">.</span><span class="highlight-n">get</span><span class="highlight-p">()</span>
            <span class="highlight-n">callable</span><span class="highlight-p">(</span><span class="highlight-o">*</span><span class="highlight-n">args</span><span class="highlight-p">,</span><span class="highlight-o">**</span><span class="highlight-n">kwds</span><span class="highlight-p">)</span>
        <span class="highlight-k">except</span><span class="highlight-p">:</span>
            <span class="highlight-k">break</span>

class ThreadPool:
def init(self,ip):
self.threads=[]
self.taskQueue=Queue()
self.threadNum=10
self.__create_taskqueue(ip)
self.__create_threadpool(self.threadNum)

<span class="highlight-k">def</span> <span class="highlight-nf">__create_taskqueue</span><span class="highlight-p">(</span><span class="highlight-bp">self</span><span class="highlight-p">,</span><span class="highlight-n">ip</span><span class="highlight-p">):</span>
    <span class="highlight-k">for</span> <span class="highlight-n">i</span> <span class="highlight-ow">in</span> <span class="highlight-nb">range</span><span class="highlight-p">(</span><span class="highlight-mi">20</span><span class="highlight-p">,</span><span class="highlight-mi">10000</span><span class="highlight-p">):</span>
        <span class="highlight-bp">self</span><span class="highlight-o">.</span><span class="highlight-n">add_task</span><span class="highlight-p">(</span><span class="highlight-n">scan</span><span class="highlight-p">,</span><span class="highlight-n">ip</span><span class="highlight-p">,</span><span class="highlight-n">i</span><span class="highlight-p">)</span>

<span class="highlight-k">def</span> <span class="highlight-nf">__create_threadpool</span><span class="highlight-p">(</span><span class="highlight-bp">self</span><span class="highlight-p">,</span><span class="highlight-n">threadNum</span><span class="highlight-p">):</span>
    <span class="highlight-k">for</span> <span class="highlight-n">i</span> <span class="highlight-ow">in</span> <span class="highlight-nb">range</span><span class="highlight-p">(</span><span class="highlight-n">threadNum</span><span class="highlight-p">):</span>
        <span class="highlight-n">thread</span><span class="highlight-o">=</span><span class="highlight-n">Worker</span><span class="highlight-p">(</span><span class="highlight-bp">self</span><span class="highlight-o">.</span><span class="highlight-n">taskQueue</span><span class="highlight-p">)</span>
        <span class="highlight-bp">self</span><span class="highlight-o">.</span><span class="highlight-n">threads</span><span class="highlight-o">.</span><span class="highlight-n">append</span><span class="highlight-p">(</span><span class="highlight-n">thread</span><span class="highlight-p">)</span>

<span class="highlight-k">def</span> <span class="highlight-nf">add_task</span><span class="highlight-p">(</span><span class="highlight-bp">self</span><span class="highlight-p">,</span><span class="highlight-n">callable</span><span class="highlight-p">,</span><span class="highlight-o">*</span><span class="highlight-n">args</span><span class="highlight-p">,</span><span class="highlight-o">**</span><span class="highlight-n">kwds</span><span class="highlight-p">):</span>
    <span class="highlight-bp">self</span><span class="highlight-o">.</span><span class="highlight-n">taskQueue</span><span class="highlight-o">.</span><span class="highlight-n">put</span><span class="highlight-p">((</span><span class="highlight-n">callable</span><span class="highlight-p">,</span><span class="highlight-n">args</span><span class="highlight-p">,</span><span class="highlight-n">kwds</span><span class="highlight-p">))</span>

<span class="highlight-k">def</span> <span class="highlight-nf">waitfor_complete</span><span class="highlight-p">(</span><span class="highlight-bp">self</span><span class="highlight-p">):</span>
    <span class="highlight-k">while</span> <span class="highlight-nb">len</span><span class="highlight-p">(</span><span class="highlight-bp">self</span><span class="highlight-o">.</span><span class="highlight-n">threads</span><span class="highlight-p">):</span>
        <span class="highlight-n">thread</span><span class="highlight-o">=</span><span class="highlight-bp">self</span><span class="highlight-o">.</span><span class="highlight-n">threads</span><span class="highlight-o">.</span><span class="highlight-n">pop</span><span class="highlight-p">()</span>
        <span class="highlight-n">thread</span><span class="highlight-o">.</span><span class="highlight-n">join</span><span class="highlight-p">(</span><span class="highlight-mf">0.1</span><span class="highlight-p">)</span>
        <span class="highlight-k">if</span> <span class="highlight-n">thread</span><span class="highlight-o">.</span><span class="highlight-n">isAlive</span><span class="highlight-p">()</span> <span class="highlight-ow">and</span> <span class="highlight-ow">not</span> <span class="highlight-bp">self</span><span class="highlight-o">.</span><span class="highlight-n">taskQueue</span><span class="highlight-o">.</span><span class="highlight-n">empty</span><span class="highlight-p">():</span>
            <span class="highlight-bp">self</span><span class="highlight-o">.</span><span class="highlight-n">threads</span><span class="highlight-o">.</span><span class="highlight-n">append</span><span class="highlight-p">(</span><span class="highlight-n">thread</span><span class="highlight-p">)</span>
    <span class="highlight-nb">print</span> <span class="highlight-s1">&#39;scaning is over!&#39;</span>

if name=='main':
target=raw_input('Enter host to scan:')
targetIP=gethostbyname(target)
print 'Starting scan on host',targetIP
tp=ThreadPool(targetIP)
tp.waitfor_complete()

在这里就直说小callable这个函数,它的功能是检查一个对象(python里面皆是对象)是否是可调用的,如果为真则返回True,如果为假则返回False。对于一个类来说,如果其含有__call__()方法,则也被认为是可调用的。

来源:http://www.oschina.net/question/220339_76762
0 python
换一个
暂无评论
Ɣ回顶部