多线程困境

问题描述 投票:-3回答:1

这是代码。计划是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()
python multithreading
1个回答
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功率,而且它主要是等待答案。

最后一个注意事项:你是从多个位置写到同一个文件,我建议反对,而是使用文件调用的互斥锁或使用多处理线程安全容器保存结果然后从主线程写入它们一切都完成后到文件

© www.soinside.com 2019 - 2024. All rights reserved.