Ситуация, есть скрипт, обходящий нужный фтп и тягающий файлики если их нет на компе, при этом работает в много потоков. И вроде бы все прекрасно, ничего не предвещало беды, но у меня мучает депрессия, нет аппетита и все потому, что он не работает как ему положено.
Я на python не писал никогда, на php ваяю только. но тут новый проект, выбор пал на python, поэтому приходится ознакамливаться.

Вобщем суть проблемы такова. По началу все работает исправно, скачивается лихо и проворно, но все это заканчивается неожиданно.
Host.walk() по идее должен обойти все папки, но он может вдруг закочить это делать на любой, как будто других и нет. Просто выходит из цикла.
Может кто подскажет в чем трабла? или подскажет как это сделать все удобнее и красивее.
import ftputil
from Queue import Queue
import os
import zipfile
from threading import Thread
from time import sleep
import re
from zipfile import ZipFile

class download(Thread):
def __init__(self, path, file, host, queue, tid):
Thread.__init__(self);
self.file = file
self.path = path
self.host = host
self.fullpath = path + "/" + file
self.queue = queue
self.tid = tid
def run(self):
if(os.path.exists(self.fullpath[0:-4]) == False and re.search('readme', self.fullpath) == None):
try:
os.system('wget -N -c -q ftp://free:free@77.246.101.195/' + self.fullpath + ' -P ' + self.path);
if(zipfile.is_zipfile(self.fullpath)):
zip = zipfile.ZipFile(self.fullpath, 'r')
zip.extractall(self.path)
os.remove(self.fullpath)
result = True
rtrn = (self.tid, result, self.file, self.path)
self.queue.put(rtrn)
except:
result = False
rtrn = (self.tid, result, self.file, self.path)
self.queue.put(rtrn)
pass
else:
result = True
rtrn = (self.tid, result, self.file, self.path)
self.queue.put(rtrn)


def new_thread(path, file, host, queue, tid):
thread = download(path, file, host, queue, tid)
thread.start()
return thread


threads = []
queue = Queue()
host = ftputil.FTPHost('77.246.101.195', 'free', 'free')
for (path, dirs, files) in host.walk(host.curdir):
if path != ".":
count = len(files)
try:
os.mkdir(path)
except:
pass
for i in range(min(20, len(files))):
threads.append(new_thread(path, files.pop(), host, queue, i))
for _ in xrange(count):
tid, result, file, path2 = queue.get()
if(result):
if len(files):
print("OK \t" + path + ' remain: ' + str(len((files))))
threads[tid] = new_thread(path, files.pop(), host, queue, tid)
else:
print("NOT OK \t" + path + ' remain: ' + str(len((files))))
threads[tid] = new_thread(path2, file, host, queue, tid)
print('The end.')