Python多线程不工作

Python多线程不工作,python,multithreading,Python,Multithreading,我刚开始学习python,得到了一个练习,创建了一个多线程脚本,以获取10个公共ftp服务器的列表,并以匿名方式连接到它们,然后只做一个目录列表。我有下面的代码,当我在run函数中使用ftp connect时,它可以工作,但是当我尝试创建一个“ftp”函数并使用它时,它不断出错,然后终端被卡住,无法终止程序或退出,我也不明白为什么会发生这种情况 !/usr/bin/python import threading import Queue import time from ftplib impo

我刚开始学习python,得到了一个练习,创建了一个多线程脚本,以获取10个公共ftp服务器的列表,并以匿名方式连接到它们,然后只做一个目录列表。我有下面的代码,当我在run函数中使用ftp connect时,它可以工作,但是当我尝试创建一个“ftp”函数并使用它时,它不断出错,然后终端被卡住,无法终止程序或退出,我也不明白为什么会发生这种情况

!/usr/bin/python

import threading
import Queue
import time
from ftplib import FTP



sites = ["speedtest.tele2.net", "test.rebex.net", "test.talia.net", "ftp.swfwmd.state.fl.us", "ftp.heanet.ie", "ftp.rediris.es", "ftp.ch.freebsd.org",  "ftp.mirror.nl", "ftp.ussg.iu.edu", "ftp.uni-bayreu$


class WorkerThread(threading.Thread) :

        def __init__(self, queue) :
                threading.Thread.__init__(self)
                self.queue = queue

        #def ftp(ip) :
        #       server = FTP(ip)
        #       server.login()
        #       server.retrlines('LIST')

        def run(self) :
                print "In WorkerThread"
                while True :
                        counter = self.queue.get()
                        print "Connecting to FTP Server %s" % counter
                        #self.ftp(counter)
                        #print "Ordered to sleep for %d seconds!" % counter
                        #time.sleep(counter)
                        #print "Finished sleeping for %d seconds" % counter

                        server = FTP(counter)
                        server.login()
                        server.retrlines('LIST')
                        self.queue.task_done()

queue = Queue.Queue()

for i in range(10) :
        print "Creating WorkerThread : %d" % i
        worker = WorkerThread(queue)
        worker.setDaemon(True)
        worker.start()
        print "WorkerThread %d Created!" % i


for j in sites :
        queue.put(j)


queue.join()

print "All Tasks Over!"
根据以下建议:

你应该设置一个停止条件,让线程检查它。与连接一起,它允许线程优雅地终止。在不涉及其他含义的情况下,请尝试下面的代码

#!/usr/bin/python

import threading
import Queue
import time
from ftplib import FTP


sites = ["speedtest.tele2.net"]


class WorkerThread(threading.Thread):

        def __init__(self, queue):
                threading.Thread.__init__(self)
                self.queue = queue
                self._stop = threading.Event()

        def ftp(self, ip):
            server = FTP(ip)
            server.login()
            server.retrlines('LIST')

        def run(self):
                print "In WorkerThread"
                while not self.stopped():
                    counter = self.queue.get()
                    print "Connecting to FTP Server %s" % counter
                    self.ftp(counter)
                    self.queue.task_done()

        def stop(self):
            self._stop.set()

        def stopped(self):
            return self._stop.is_set()


if __name__ == '__main__':

    queue = Queue.Queue()

    for i in range(10):
            print "Creating WorkerThread : %d" % i
            worker = WorkerThread(queue)
            worker.setDaemon(True)
            worker.start()
            worker.stop()
            print "WorkerThread %d Created!" % i

    for j in sites:
            queue.put(j)

    queue.join()

    print "All Tasks Over!"

您应该对异常进行回溯,以获得更多关于该问题的信息,无论是哪种方式,乍一看,您的ftp方法都没有获得正确的参数。在编写时,您将获得类实例,它始终作为第一个参数传递到ip参数中。我认为你应该将这个方法声明为
def ftp(self,ip)
。你的权利是有效的,当我将它定义为def ftp(self,ip)时,但由于某种原因,当它完成时,它被卡住了,我甚至无法将其退出。哇,感谢代码,我尝试了它,但我仍然无法退出,当我点击ctrl-c时,这是正常的吗?这很正常,因为你的进程不处理外部信号。尽管如此,我还是希望这个过程在列表被使用后终止。在一台服务器上检查了这一点,但我必须承认,在处理线程时,这是一个典型的问题:调试变得相当复杂。