ВСТАВЬТЕ в таблицу БД результаты из загруженных файлов, используя Pysftp и Multithreading - PullRequest
0 голосов
/ 08 мая 2018

Все еще связано со следующим Вопросом ... Параллельная загрузка с мультипроцессором и PySftp

Я хотел бы знать, как распечатать успешные загрузки? Мое намерение - добавить запись в таблицу базы данных, чтобы создать журнал загруженных файлов с именем, датой и временем.

Есть идеи? Я искал несколько примеров и провел несколько тестов, но, похоже, мой модуль загрузки не может ничего вернуть или я не использую правильный код для чтения результатов и их распечатки.

Функция ЗАГРУЗКИ

import pysftp
import os

def fdownload(vfileaux):

    vtmpspl = vfileaux.split(',')

    vfile = vtmpspl[0]
    vhost = vtmpspl[1]
    vlogin = vtmpspl[2]
    vpwd = vtmpspl[3]
    vftppath = vtmpspl[4]
    vlocalpath = vtmpspl[5]

    os.chdir(vlocalpath)
    os.getcwd()

    cnopts = pysftp.CnOpts()
    cnopts.hostkeys = None

    vfilecheck = vlocalpath + '/' + vfile

    if not os.path.isfile(vfilecheck):

        vftpaux = pysftp.Connection(host=vhost, username=vlogin, password=vpwd, cnopts=cnopts)
        vftpaux.cwd(vftppath)
        vftpaux.get(vfile, preserve_mtime=True)
        vftpaux.close()

        return vnename + "_" + vdatetime

    else:
        pass

ОСНОВНАЯ функция

from datetime import *
from ffilelist import *
from ffilefilter import *
from developing.fdownload import *
import pymysql.cursors
from concurrent.futures import ThreadPoolExecutor, wait, as_completed

def main():

    print(datetime.datetime.now(), 'Loading variables...')

    vhostlist = {}
    vloginlist = {}
    vpwdlist = {}
    vftppathlist = {}
    vlocalpathlist = {}

    vhostaux = '10.11.12.13'
    vhostlist[vhostaux] = vhostaux
    vloginlist[vhostaux] = 'admin'
    vpwdlist[vhostaux] = 'pass1234'
    vftppathlist[vhostaux] = '/export/home'
    vlocalpathlist[vhostaux] = 'd:/test/'

    vfilelist1 = []

    global vfilelist2
    vfilelist2 = []

    for vhosttmp in vhostlist:

        print(datetime.datetime.now(), 'Starting to process ' + vhosttmp + "...")

        global vhost
        global vlogin
        global vpwd
        global vftppath
        global vlocalpath

        vhost = vhostlist[vhosttmp]
        vlogin = vloginlist[vhosttmp]
        vpwd = vpwdlist[vhosttmp]
        vftppath = vftppathlist[vhosttmp]
        vlocalpath = vlocalpathlist[vhosttmp]

        vfilelist1 = ffilelist(vhost, vlogin, vpwd, vftppath)

        print(datetime.datetime.now(), 'Vectorizing download file     list...')

        for vfile in vfilelist1:
            vfilelist2.append(vfile + ',' + vhost + ',' + vlogin + ',' +     vpwd + ',' + vftppath + ',' + vlocalpath)

    vfilelist0 = ffilefilter(vfilelist2)

    print(datetime.datetime.now(), 'Starting simultaneous downloads...')

    vpool = concurrent.futures.ProcessPoolExecutor(max_workers=8)
    vpool.map(fdownload, vfilelist0)
    vpool.shutdown()

    print(datetime.datetime.now(), 'Downloads finished!')

Строка INSERT для журнала, который будет храниться в MARIADB, выглядит примерно так. Уже проверено и работает. Для использования в ОСНОВНОЙ функции, как только я найду решение для получения списка загруженных файлов.

vconn = pymysql.connect(host='localhost', user='root', password='pass1234', db='test')
vcurs = vconn.cursor()
vsql = "INSERT INTO `logs_download` (`ne`, `datetime`) VALUES (\'" + vnename + "\', \'" + vdatetime + "\')"
vcurs.execute(vsql)
vconn.commit()

1 Ответ

0 голосов
/ 08 мая 2018

Я попробовал то, что предложил Алекс ... поэтому я изменил часть кода:

vpool = concurrent.futures.ThreadPoolExecutor(max_workers=8) 
print(vpool.map(fdownload, vfilelist0)) 
vpool.shutdown()

... но получил следующие результаты:

2018-05-08 12:44:25.115066 Loading variables...
2018-05-08 12:44:25.115066 Starting to process 10.11.12.13...
2018-05-08 12:44:25.115066 Disabling known hosts...
2018-05-08 12:44:25.115066 Opening FTP connection...
2018-05-08 12:44:26.567149 Reading objects list...
2018-05-08 12:45:30.580015 Separating files from folders...
2018-05-08 12:45:30.584015 Closing FTP connection...
2018-05-08 12:45:30.585015 Vectorizing download file list...
2018-05-08 12:45:30.596016 Filtering latest file for each object...
2018-05-08 12:45:30.648019 Vectorizing only latest files...
2018-05-08 12:45:30.652019 Starting simultaneous downloads...
<generator object Executor.map.<locals>.result_iterator at 0x04332D20>
...