Python 3.x Traceroute IP与python3.8和多处理
我需要追踪一些IP地址。我为每个地址创建进程(使用multoprocessing模块)。但我得到了同样的结果。 我不知道是什么问题。也许我使用的多重处理不正确。或者是关于ICMPLIB的 我的代码:Python 3.x Traceroute IP与python3.8和多处理,python-3.x,multiprocessing,icmp,Python 3.x,Multiprocessing,Icmp,我需要追踪一些IP地址。我为每个地址创建进程(使用multoprocessing模块)。但我得到了同样的结果。 我不知道是什么问题。也许我使用的多重处理不正确。或者是关于ICMPLIB的 我的代码: import multiprocessing as mp from icmplib import traceroute def tracerouting(target, q): #tracerouting with icmplib data = traceroute(target)
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函数的工作原理相同 从我在项目页面()上看到的情况来看,您必须为每个流程使用不同的标识符,以便将响应与请求相匹配。默认情况下,每次调用都会使用程序的PID,因此可能存在冲突。由于您希望并行化多个跟踪路由,我建议您为每个进程分配一个唯一的ID(介于0和65535之间) 否则,为什么要对此类任务使用多处理?线似乎更合适
traceroute(address, id=YOUR_THREAD_ID)
最后,回答您的另一个问题:不,在所有跟踪路由之间没有共享套接字。存在原始套接字(极低级别)。有必要处理IP和ICMP头,但不如DGRAM或流套接字灵活。原始套接字可以拾取不适合它们的ICMP消息,像icmplib这样的库通常使用标识符和序列号(自动递增)来匹配响应和请求。这就是为什么,我建议您不要在跟踪路由之间使用相同的标识符:)
我认为这应该可以解决您的问题。我假设每个进程都在访问单个套接字。这导致了混乱。