多线程困境

时间:2017-12-25 03:55:14

标签: python multithreading

这是代码。 计划是ping一个范围内的所有主机并获取fqdn ...这是有效的,但需要一段时间......所以考虑多处理......但是无法让它工作。代码只是挂在p.map(...)而不是那个。 有人可以帮忙吗?.............希望代码是可读的..

import subprocess
import os
import socket
import multiprocessing
from multiprocessing.dummy import Pool as ThreadPool 
from datetime import datetime



range_85 = "10.85.40"
range_87 = "10.87.40"

print ("starting")

replyfile = open("pingdns_replies.txt", "a")
#replyfile.write("START %s \n" % datetime.now())

print("file opened")


def ping(host):
        print ("entered function")
        #for ip in range (50,250):
                #host = range_85 +"."+ str(ip)
        print (host)
        rep = subprocess.call("ping %s" % host, shell=False)
        if rep == 0:   
                try:
                        dns = socket.getfqdn(host)
                except:
                        dns = " "
                        print ("%s at %s is up" % (dns, host))
                        replyfile.write(" %s at %s is up \n" % (dns, host))
        else:
                try:
                        dns = socket.getfqdn(host)
                        print("%s at %s is down ?" % (dns, host))
                        replyfile.write(" %s at %s is down ? \n" % (dns,host))
                except:
                        dns = " "
                        print ("%s received no reply" % host)
                        replyfile.write(" %s received no reply \n" % (dns, host))

#ips = (range_85 + "." + str(i) for i in range(0,255))

ips = []
for i in range(1,255):
        ips.append(range_85+'.'+str(i))


print ("ips created")
print (ips)


with multiprocessing.Pool(2) as p:        
        p.map(ping, ips)

replyfile.write("END %s \n" % datetime.now())
replyfile.close()

1 个答案:

答案 0 :(得分:0)

此代码不完整,因此很难确定, 但似乎您正在尝试创建一个要在此行中扫描的ips列表:

ips = range_85 +"."+ str('%d' % i for i in range(1,254))

问题在于str()转换,您将生成器对象转换为字符串,而不是实际生成生成器的每个元素的字符串

为您的ip范围创建一个生成器,您可以用以下内容替换该行:

ips = ( range_85 + "." + str(i) for i in range(1,254))

我应该注意你从ip范围中排除0和254,它们在你的ip范围内仍然有效(即使你不想ping 10.85.40.255)范围(0,255)会给你整个ip范围(排除255)

修改

鉴于问题完全改变,这里是新问题的答案:

你的ping调用永远不会返回,至少在Linux上“ping xx.xx.xx.xx”将无限期地发送icmp数据包,直到它被SIGINT停止

你可以在这里参考ping文档:https://linux.die.net/man/8/ping

尝试更改行

rep = subprocess.call("ping 1 %s" % host, shell=False)

rep = subprocess.call("ping -c 1 %s" % host, shell=False)

请注意,如果您想确保随机数据包丢弃不会影响结果,您可以而且应该发送多个数据包。

你似乎只使用2个线程的线程池,除非你的资源令人难以置信地饿了,你可以使用更多的东西(如果你使用普通的PC,可能会有数百个),因为ping命令不需要大量的CPU电源,它只是挂起等待答案。

最后一个注意事项:你是从多个位置写到同一个文件,我建议不要这样做,而是在文件调用周围使用互斥锁,或者使用多处理线程安全容器保存结果然后从中写入一切都完成后,文件的主线程