一.Queue模块基础
q = Queue.Queue()
q.qsize() 返回队列的大小
q.empty() 如果队列为空,返回True,反之False
q.full() 如果队列满了,返回True,反之False
q.full 与 maxsize 大小对应
q.get([block[, timeout]]) 获取队列,timeout等待时间
q.get_nowait() 相当q.get(False)
q.put(item) 写入队列,timeout等待时间
q.put_nowait(item) 相当q.put(item, False)
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
q.join() 实际上意味着等到队列为空,再执行别的操作
二.threading模块基础
t = threading.Thread 使用它来创建线程
t.start() 开始线程的执行
t.run() 包含了线程实际执行的内容
t.join(timeout=None) 被调用 join() 方法的线程会一直阻塞调用者的线程,直到自己结束
t.name 用于鉴别进程的一个字符串
t.getName()/t.setName() 为后向兼容而保留的方法,现在请直接通过 name 属性来访问
t.ident 如果线程还未开始,则值为 None
t.is_alive() 返回本进程是否是 alive 状态
t.daemon 标明本进程是否为“daemon thread”。一定要在 start() 被调用前设定,否则引发 RuntimeError。
t.isDaemon() / t.setDaemon() 为后向兼容而保留的方法,现在请直接访问 daemon 属性
lock = threading.Lock
lock.acquire(blocking=True,timeout=-1) 获取一个锁
lock.release() 释放一个锁
三.多线程端口扫描器
# -*- coding: utf-8 -*- __author__ = 'Dleo' import sys import socket import threading import Queue ports=[21,80,445,3389] queue = Queue.Queue() def ip_c(ip): new_ip = [] for ip_c in range(1,255): new_ip.append(str(ip) + "." + str(ip_c)) #print new_ip return new_ip class ThreadNum(object): def __init__(self, queue): self.queue = queue self.lock = threading.Lock() def port_open(self): while True: try: try: ip = self.queue.get(timeout=1) except: break for port in ports: socket.setdefaulttimeout(0.5) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if s.connect_ex((ip, port)) == 0: self.lock.acquire() print (ip + ':' + str(port) + ' is openning') self.lock.release() s.close() except: pass self.queue.task_done() def run (self): tmp = [] for i in range(255): t = threading.Thread(target=self.port_open) t.setDaemon(True) t.start() tmp.append(t) for t in tmp: t.join() if __name__ == '__main__': if len(sys.argv) != 2: print "please put ip like this '127.0.0' " sys.exit() ip = sys.argv[1] for i in ip_c(ip): queue.put(i) t = ThreadNum(queue) t.run()
效果图: