Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用Python多线程创建发现脚本_Python_Multithreading_Networking - Fatal编程技术网

尝试使用Python多线程创建发现脚本

尝试使用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:

我正在尝试创建一个发现脚本,它将使用多线程同时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:
            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()方法
  • 现在,任务将在后台运行,所有其他任务将被放入队列中,以便为您异步运行。 因此,您可以将所有内容放入一个循环中,队列将为您处理它

    关于芹菜的信息:
    这是一个很好的教程,可以获取所有信息