Python多线程不工作
我刚开始学习python,得到了一个练习,创建了一个多线程脚本,以获取10个公共ftp服务器的列表,并以匿名方式连接到它们,然后只做一个目录列表。我有下面的代码,当我在run函数中使用ftp connect时,它可以工作,但是当我尝试创建一个“ftp”函数并使用它时,它不断出错,然后终端被卡住,无法终止程序或退出,我也不明白为什么会发生这种情况Python多线程不工作,python,multithreading,Python,Multithreading,我刚开始学习python,得到了一个练习,创建了一个多线程脚本,以获取10个公共ftp服务器的列表,并以匿名方式连接到它们,然后只做一个目录列表。我有下面的代码,当我在run函数中使用ftp connect时,它可以工作,但是当我尝试创建一个“ftp”函数并使用它时,它不断出错,然后终端被卡住,无法终止程序或退出,我也不明白为什么会发生这种情况 !/usr/bin/python import threading import Queue import time from ftplib impo
!/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时,这是正常的吗?这很正常,因为你的进程不处理外部信号。尽管如此,我还是希望这个过程在列表被使用后终止。在一台服务器上检查了这一点,但我必须承认,在处理线程时,这是一个典型的问题:调试变得相当复杂。