多处理python模块无法放回处理结果

时间:2015-10-21 10:08:47

标签: python python-2.7 multiprocessing python-multithreading

我正在编写TCP SYN扫描程序,检查所有已打开的端口。该脚本可以通过使用多个核心来获取所有打开的端口。在脚本结束时,尝试使用get()方法获取结果时,脚本将无法运行。在执行键盘中断时,会出现一个在代码下面提到的Traceback。当我使用2个内核时,脚本运行正常但是当循环运行3次或更多次(使用3个或更多内核)时,脚本会卡住。关于如何进一步解决这个问题的任何建议?

==============代码如下============================== =======

user_id

===========输出======================

#!/usr/bin/python

import multiprocessing as mp
from scapy.all import *
import sys
import time


results = []
output = mp.Queue()
processes = []

def portScan(ports,output):

    ip = sys.argv[1]
    for port in range(ports-100,ports):
         response = sr1(IP(dst=ip)/TCP(dport=port, flags="S"), verbose=False, timeout=.2)
         if response:
               if response[TCP].flags == 18 :
                     print "port number ======> %d <====== Status: OPEN" %(port)

                     output.put(port)



ports = 0

for loop in range(4):
    ports += 100
    print "Ports %d sent as the argument"%ports
    processes.append(mp.Process(target=portScan,args=(ports,output)))


for p in processes:
        p.start()


for p in processes:
        p.join()



results = [output.get() for p in processes]

===========回溯===================

 ./tcpSynmultiprocess.py 10.0.2.1 

WARNING: No route found for IPv6 destination :: (no default route?)
  Ports 100 sent as the argument
  Ports 200 sent as the argument
  Ports 300 sent as the argument
  port number ======> 23 <====== Status: OPEN
  port number ======> 80 <====== Status: OPEN
  ^CTraceback (most recent call last):

一个KeyboardInterrupt

2 个答案:

答案 0 :(得分:2)

默认情况下,Queue.get()会阻塞,直到有数据要返回,如果所有进程都已结束,则不会阻止。

您可以使用output.get(False)来阻止不返回任何内容的进程(您必须处理Queue.Empty异常)。

或者,由于队列大小也可能大于进程数,因此您应该使用Queue.qsize()而不是processes

results = [output.get() for x in range(output.qsize())]

答案 1 :(得分:0)

#!/usr/bin/python

import multiprocessing as mp
from scapy.all import *
import sys
import time


results = []
output = mp.Queue()
processes = []

def portScan(ports,output):

    ip = sys.argv[1]
    for port in range(ports-100,ports):
    response = sr1(IP(dst=ip)/TCP(dport=port, flags="S"), verbose=False, timeout=.2)
     if response:
           if response[TCP].flags == 18 :
                 print "port number ======> %d <====== Status: OPEN" %(port)

                 output.put(port)



ports = 0

for loop in range(4):
    ports += 100
    print "Ports %d sent as the argument"%ports
    processes.append(mp.Process(target=portScan,args=(ports,output)))


for p in processes:
    p.start()


for p in processes:
    p.join()



for size in range(output.qsize()):
    try: 
        results.append(output.get())
    except:
        print "Nothing fetched from the Queue..."

print results