问题描述
我需要跟踪路由某些IP地址。我为每个地址创建进程(使用multoprocessing模块)。但我得到相同的结果。 我不知道出什么问题了。也许我使用的是错误的多重处理。还是关于ICMPLIB。
我的代码:
import multiprocessing as mp
from icmplib import traceroute
def tracerouting(target,q): #tracerouting with icmplib
data = traceroute(target)
q.put(data)
if __name__ == "__main__":
q = mp.Queue()
targetList = ['google.com','mail.ru']
#creating processes for addresses
processes = [mp.Process(target=tracerouting,args = (ip,q))for ip in targetList]
for p in processes:
p.start()
for p in processes:
p.join()
print('Queues')
#printind data
for p in processes:
data = q.get()
print(data)
执行结果:
队列 [
, , , , , , , , ] [ , , , , , , , , , ]
解决方法
我也在我的项目中使用此库。我主要使用ping和multiping函数,但通常它与traceroute函数的作用相同。
根据我在项目页面(https://github.com/ValentinBELYN/icmplib#traceroute上看到的内容),必须为每个流程使用不同的标识符,以使响应与请求相匹配。默认情况下,每次调用都会使用程序的PID,因此可能会发生冲突。由于要并行化多个跟踪路由,因此建议您为每个进程分配一个唯一的ID(0到65535之间)。
否则为什么要对这种任务使用多重处理?线程似乎更合适。
traceroute(address,id=YOUR_THREAD_ID)
最后,要回答您的另一个问题,不,您的所有traceroute之间没有共享套接字。有RAW插槽(非常低的水平)。处理IP和ICMP标头很重要,但不如DGRAM或STREAM套接字灵活。 RAW套接字可以接收不适合它们的ICMP消息,并且icmplib之类的库通常使用标识符和序列号(自动递增)来将响应与请求进行匹配。这就是为什么,我建议您在traceroute之间不要使用相同的标识符:)
我认为这应该可以解决您的问题。