尝试使用Python多线程创建发现脚本
我正在尝试创建一个发现脚本,它将使用多线程同时ping多个IP地址尝试使用Python多线程创建发现脚本,python,multithreading,networking,Python,Multithreading,Networking,我正在尝试创建一个发现脚本,它将使用多线程同时ping多个IP地址 import ipaddress import sh from threading import Thread from Queue import Queue user_input = raw_input("") network = ipaddress.ip_network(unicode(user_input)) def pingit(x): for i in x.hosts(): try:
import ipaddress
import sh
from threading import Thread
from Queue import Queue
user_input = raw_input("")
network = ipaddress.ip_network(unicode(user_input))
def pingit(x):
for i in x.hosts():
try:
sh.ping(i, "-c 1")
print i, "is active"
except sh.ErrorReturnCode_1:
print "no response from", i
queue_to_work = Queue(maxsize=0)
number_of_workers = 30
for i in range(number_of_workers):
workers = Thread(target=pingit(network),args=(queue_to_work,))
workers.getDaemon(True)
workers.start()
当我运行这个脚本时,我会得到ping响应,但速度并不快。我相信多线程并没有起作用
谁能告诉我哪里出了问题
非常感谢。你完全做错了
import ipaddress
import sh
from threading import Thread
user_input = raw_input("")
network = ipaddress.ip_network(unicode(user_input))
def pingit(x):
for i in x.hosts():
try:
sh.ping(i, "-c 1")
print i, "is active"
except sh.ErrorReturnCode_1:
print "no response from", i
workers = Thread(target=pingit,args=(network,))
workers.start()
这就是你如何开始一个线程。编写pingit(网络)
将实际运行函数,并将其结果传递到线程
,而您希望传递函数本身。您应该分别传递函数pingit
和参数network
。注意,这将创建一个实际运行的线程pingit(网络)
现在,如果您想使用多个线程,您可以在一个循环中这样做。但是,您还必须创建单独的数据集来输入线程。考虑一下你有一个主机列表,比如代码> [a,b,'c','d])/c>,你想从两个线程中ping它们。您必须创建两个线程,分别调用pingit(['A','B'])
和pingit(['C','D'])
请注意,不要使用ip\u网络
查找ip地址,请使用ip\u地址
。您可以ping一个ip地址,但不能ping一个网络。当然,如果要ping网络中的所有ip地址,ip\u-network
就可以了
您可能希望以某种方式将用户输入拆分为多个ip地址,并将列表拆分为线程的子列表。这很容易。现在您可以为编写一个
,以创建线程,并将每个子列表输入到线程的参数中。这将创建实际使用不同参数运行的线程。您的操作完全错误
import ipaddress
import sh
from threading import Thread
user_input = raw_input("")
network = ipaddress.ip_network(unicode(user_input))
def pingit(x):
for i in x.hosts():
try:
sh.ping(i, "-c 1")
print i, "is active"
except sh.ErrorReturnCode_1:
print "no response from", i
workers = Thread(target=pingit,args=(network,))
workers.start()
这就是你如何开始一个线程。编写pingit(网络)
将实际运行函数,并将其结果传递到线程
,而您希望传递函数本身。您应该分别传递函数pingit
和参数network
。注意,这将创建一个实际运行的线程pingit(网络)
现在,如果您想使用多个线程,您可以在一个循环中这样做。但是,您还必须创建单独的数据集来输入线程。考虑一下你有一个主机列表,比如代码> [a,b,'c','d])/c>,你想从两个线程中ping它们。您必须创建两个线程,分别调用pingit(['A','B'])
和pingit(['C','D'])
请注意,不要使用ip\u网络
查找ip地址,请使用ip\u地址
。您可以ping一个ip地址,但不能ping一个网络。当然,如果要ping网络中的所有ip地址,ip\u-network
就可以了
您可能希望以某种方式将用户输入拆分为多个ip地址,并将列表拆分为线程的子列表。这很容易。现在您可以为
编写一个,以创建线程,并将每个子列表输入到线程的参数中。这将创建实际使用不同参数运行的线程。我想分享一下我的想法
因为我想这是您希望在后台运行的东西,所以我建议您使用队列而不是线程
这将为您提供多种优势:
- 您可以向队列中添加多个功能
- 如果发生了什么,队列将继续,并为您捕获错误。您甚至可以添加一些日志记录,以防出现问题李>
- 队列作为守护进程运行,队列中的每一项都是它自己的进程
- RabbitMQ或Redis等系统是为这种特定任务构建的李>
- 它相对容易设置
我为您创建了一个简单的脚本,您可以使用:
import subprocess
from celery import Celery
app = Celery()
@app.task
def check_host(ip, port=80, timeout=1):
output = subprocess.Popen(["ping", "-c", "1", ip], stdout=subprocess.PIPE).communicate()[0]
if "1 packets received" in output.decode("utf-8"):
return "{ip} connected successfully".format_map(vars())
else:
return "{ip} was unable to connect".format_map(vars())
def pingit(ip="8.8.8.8"):
check_host.delay(ip)
它的作用如下
首先导入芹菜,这将使您能够连接到在后台运行的芹菜李>
您在芹菜类的实例中创建了一个应用程序
您使用此应用程序创建任务。在这个任务中,您可以放置所有要执行的异步操作
对任务调用delay()方法
现在,任务将在后台运行,所有其他任务将被放入队列中,以便为您异步运行。
因此,您可以将所有内容放入一个循环中,队列将为您处理它
关于芹菜的信息:
这是一个很好的教程,可以让我在YouTube上找到所有设置:
我希望这能进一步帮助您我想分享一下我的想法
因为我想这是您希望在后台运行的东西,所以我建议您使用队列而不是线程
这将为您提供多种优势:
- 您可以向队列中添加多个功能
- 如果发生了什么,队列将继续,并为您捕获错误。您甚至可以添加一些日志记录,以防出现问题李>
- 队列作为守护进程运行,队列中的每一项都是它自己的进程
- RabbitMQ或Redis等系统是为这种特定任务构建的李>
- 它相对容易设置
我为您创建了一个简单的脚本,您可以使用:
import subprocess
from celery import Celery
app = Celery()
@app.task
def check_host(ip, port=80, timeout=1):
output = subprocess.Popen(["ping", "-c", "1", ip], stdout=subprocess.PIPE).communicate()[0]
if "1 packets received" in output.decode("utf-8"):
return "{ip} connected successfully".format_map(vars())
else:
return "{ip} was unable to connect".format_map(vars())
def pingit(ip="8.8.8.8"):
check_host.delay(ip)
它的作用如下
首先导入芹菜,这将使您能够连接到在后台运行的芹菜李>
您在芹菜类的实例中创建了一个应用程序
您使用此应用程序创建任务。在这个任务中,您可以放置所有要执行的异步操作
对任务调用delay()方法
现在,任务将在后台运行,所有其他任务将被放入队列中,以便为您异步运行。
因此,您可以将所有内容放入一个循环中,队列将为您处理它
关于芹菜的信息:
这是一个很好的教程,可以获取所有信息